Как вы можете использовать дополнительные параметры в C #? - PullRequest
436 голосов
/ 14 октября 2008

Примечание: Этот вопрос задавался в то время, когда C # еще не поддерживал необязательные параметры (т.е. до C # 4).

Мы создаем веб-API, который программно генерируется из класса C #. У класса есть метод GetFooBar(int a, int b), а у API есть метод GetFooBar, принимающий параметры запроса, такие как &a=foo &b=bar.

Классы должны поддерживать необязательные параметры, которые не поддерживаются в языке C #. Какой лучший подход?

Ответы [ 19 ]

3 голосов
/ 14 октября 2008

Типичный способ, которым это обрабатывается в C #, как упомянул Стивен, - перегрузить метод. Создавая несколько версий метода с различными параметрами, вы эффективно создаете необязательные параметры. В формах с меньшим количеством параметров вы обычно вызываете форму метода со всеми параметрами, устанавливающими значения по умолчанию при вызове этого метода.

2 голосов
/ 09 декабря 2014

Вы можете перегрузить свой метод. Один метод содержит один параметр GetFooBar(int a), а другой - оба параметра, GetFooBar(int a, int b)

0 голосов
/ 03 января 2011

Я должен был сделать это в веб-сервисе VB.Net 2.0. В итоге я указал параметры в виде строк, а затем преобразовал их в то, что мне было нужно. Необязательный параметр был указан с пустой строкой. Не самое чистое решение, но оно сработало. Только будьте осторожны, чтобы перехватить все возможные исключения.

0 голосов
/ 23 марта 2018

Вы можете попробовать это тоже
Тип 1
public void YourMethod(int a=0, int b = 0) { //some code }


Тип 2
public void YourMethod(int? a, int? b) { //some code }

0 голосов
/ 14 октября 2008

Вместо параметров по умолчанию, почему бы просто не создать класс словаря из переданной строки запроса ... реализация, которая почти идентична тому, как формы asp.net работают со строками запроса.

т.е. Request.QueryString ["a"]

Это отделит класс листа от заводского / стандартного кода.


Вы также можете проверить Веб-службы с ASP.NET . Веб-сервисы - это веб-API, генерируемые автоматически с помощью атрибутов в классах C #.

0 голосов
/ 17 июня 2015

На всякий случай, если кто-то хочет передать обратный вызов (или delegate) в качестве необязательного параметра, можете сделать это следующим образом.

Необязательный параметр обратного вызова:

public static bool IsOnlyOneElement(this IList lst, Action callbackOnTrue = (Action)((null)), Action callbackOnFalse = (Action)((null)))
{
    var isOnlyOne = lst.Count == 1;
    if (isOnlyOne && callbackOnTrue != null) callbackOnTrue();
    if (!isOnlyOne && callbackOnFalse != null) callbackOnFalse();
    return isOnlyOne;
}
0 голосов
/ 17 ноября 2009

Немного опоздал на вечеринку, но я искал ответ на этот вопрос и в конечном итоге придумал еще один способ сделать это. Объявите типы данных для необязательных аргументов вашего веб-метода как тип XmlNode. Если опциональный аргумент arg опущен, для него будет установлено значение null, а если он присутствует, вы можете получить строковое значение, вызвав arg.Value, т.е.,

[WebMethod]
public string Foo(string arg1, XmlNode optarg2)
{
    string arg2 = "";
    if (optarg2 != null)
    {
        arg2 = optarg2.Value;
    }
    ... etc
}

Что еще прилично в этом подходе, так это то, что сгенерированная .NET домашняя страница для ws по-прежнему показывает список аргументов (хотя вы теряете удобные поля ввода текста для тестирования).

0 голосов
/ 02 августа 2018

необязательные параметры - это не что иное, как параметры по умолчанию! Я предлагаю вам дать оба параметра по умолчанию. GetFooBar (int a = 0, int b = 0), если у вас нет перегруженного метода, приведет к a = 0, b = 0, если вы не передадите никаких значений, если вы передадите 1 значение, приведет к , переданное значение для a, 0 и если вы передадите 2 значения, 1-е будет присвоено a, а второе - b.

надеюсь, что ответит на ваш вопрос.

0 голосов
/ 22 декабря 2009

У меня есть веб-сервис для записи, который принимает 7 параметров. Каждый из них является необязательным атрибутом запроса для оператора SQL, заключенного в этот веб-сервис. Итак, на ум приходят два обходных пути к необязательным параметрам ... оба довольно плохие:

method1 (param1, param2, param 3, param 4, param 5, param 6, param7) method1 (param1, param2, param3, param 4, param5, param 6) метод 1 (param1, param2, param3, param4, param5, param7) ... начать видеть картину. Этот путь лежит безумие. Слишком много комбинаций.

Теперь о более простом способе, который выглядит неудобно, но должен работать: method1 (param1, bool useParam1, param2, bool useParam2 и т. д ...)

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

Это взлом, но это будет работать.

...