Как они реализовали этот синтаксис в параметрах Massive Micro-ORM, множественные аргументы? - PullRequest
6 голосов
/ 27 мая 2011

Здесь на этой странице Скотт Хансельман показывает два примера из микро-ORM Dapper и Massive, и пример Massive заинтересовал меня, потому что я не понимаю, как они могли реализовать этот синтаксис. 1003 *

Пример выглядит следующим образом: я собираюсь разбить его на несколько строк вместо одной длинной:

var tbl = new Products();
var products = tbl.All(where: "CategoryID = @0 AND UnitPrice > @1",
    orderBy: "ProductName", limit: 20, args: 5,20);
                                       ^----+---^
                                            |
                                            +-- this

Как они реализовали этот синтаксис, позволяющий args иметь несколько значений? Я предполагаю аргументы, основанные на params, потому что это единственное, что позволяет это сделать, но я не понимаю, как они сконструировали метод, позволяющий это сделать, поскольку мне кажется, что все, что я пытаюсь, заканчивается жалобой на named аргументы и аргументы с фиксированной позицией расположены в неправильном порядке.

Я попробовал метод теста, подобный этому:

public static void Test(string name, int age, params object[] args)
{
}

и затем использование именованных аргументов:

Test(age: 40, name: "Lasse", args: 10, 25);

Но все, что я получаю, это:

Спецификации именованных аргументов должны появляться после указания всех фиксированных аргументов

так очевидно, что это неправильно. Также я не вижу в источнике ничего, что могло бы допустить это, но, возможно, я смотрю не в том месте.

Что мне здесь не хватает?

Ответы [ 2 ]

8 голосов
/ 27 мая 2011

На самом деле я думаю, что мистер Хансельман показал какой-то код, который не компилируется (упс, я действительно осмелился это сказать?). Я могу заставить работать только так:

 Test(age: 40, name: "Lasse", args: new object[] { 10, 25 });
2 голосов
/ 01 июля 2011

Это просто именованные аргументы в C # 4.0.Вы можете указать свои аргументы, используя имя параметра, как вы видите в своем вызове выше.

Чтобы принять массив (как вы видите с несколькими аргументами) - вы просто используете ключевое слово "params":

public void MyMethod (строка arg1, params object [] args){// ..}

Теперь, чтобы вызвать этот метод в C # 4.0, вы можете использовать «MyMethod (arg1:« Lasse », args: 1,2,4,5)»

...