Как они реализовали этот синтаксис в Massive Micro-ORM с несколькими параметрами args?

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

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

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

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

Я попробовал такой тестовый метод:

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

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

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

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

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

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

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


person Lasse V. Karlsen    schedule 26.05.2011    source источник


Ответы (2)


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

 Test(age: 40, name: "Lasse", args: new object[] { 10, 25 });
person Richard    schedule 27.05.2011
comment
Это имеет смысл, возможно, мне следует вернуться в его блог и спросить там... возможно, это был бы правильный подход для начала, да ладно. Я воздержусь от принятия этого ответа, чтобы посмотреть, есть ли способ (хотя я в этом сомневаюсь). - person Lasse V. Karlsen; 27.05.2011
comment
Хм, я скопировал это из блога Роба. Извини за это. - person Scott Hanselman; 04.06.2011

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

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

public void MyMethod(string arg1, params object[] args){ //.. }

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

person Community    schedule 30.06.2011
comment
Вы уверены, что я могу вызвать его с помощью args:1,2,4,5 ? Я не могу заставить это скомпилировать. Я могу только это компилировать: args: new[] { 1,2,4,5 }. Просто для ясности: я не спрашиваю о части args:, я полностью осведомлен о том, как работают именованные аргументы в C# 4.0, в частности, я спрашиваю о части 1,2,4,5. - person Lasse V. Karlsen; 01.07.2011
comment
Хм - ну я уверен, а то я не уверен. Это странно - если вы передадите только ОДИН аргумент в args:, то он будет работать. Если вы передаете несколько, то я получаю ту же ошибку, что и вы. СКИИИ! - person ; 06.07.2011