Как вы можете использовать дополнительные параметры в C #?

Вы можете использовать

<button id="file">select file</button>
<input type="file" name="file" id="file_input" style="display:none;">
<script>
$('#file').click(function() {
        $('#file_input').focus().trigger('click');
    });
</script>
442
задан Julian 20 March 2017 в 17:38
поделиться

13 ответов

Удивлен, что никто не упомянул необязательные параметры C # 4.0, которые работают следующим образом:

public void SomeMethod(int a, int b = 0)
{
   //some code
}

Изменить : Я знаю, что в то время, когда был задан вопрос, C # 4.0 не существовало. Но этот вопрос по-прежнему занимает первое место в Google по «необязательным аргументам C #», поэтому я подумал, что этот ответ стоит здесь. Прости.

999
ответ дан 22 November 2019 в 23:01
поделиться

Привет Дополнительный Мир

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

using System;
using System.Runtime.InteropServices;
using System.Reflection;

namespace ConsoleApplication1
{
    class Class1
    {
        public static void sayHelloTo(
            [Optional,
            DefaultParameterValue("world")] string whom)
        {
            Console.WriteLine("Hello " + whom);
        }

        [STAThread]
        static void Main(string[] args)
        {
            MethodInfo mi = typeof(Class1).GetMethod("sayHelloTo");
            mi.Invoke(null, new Object[] { Missing.Value });
        }
    }
}
19
ответ дан Hugh Allen 20 March 2017 в 17:38
поделиться

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

3
ответ дан cfbarbero 20 March 2017 в 17:38
поделиться

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

т.е. Запрос. QueryString["a"]

Это разъединит листовой класс от фабрики / шаблонный код.

<час>

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

0
ответ дан Robert Paulson 20 March 2017 в 17:38
поделиться

От этого сайта:

http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1

C# действительно позволяет использование [Дополнительного] атрибута (от VB, хотя не функциональный в C#). Таким образом, у Вас может быть метод как это:

using System.Runtime.InteropServices;
public void Foo(int a, int b, [Optional] int c)
{
  ...
}

В нашей обертке API, мы обнаруживаем дополнительные параметры (ParameterInfo p. IsOptional) и набор значение по умолчанию. Цель состоит в том, чтобы отметить параметры как дополнительные, не обращаясь к клуджам как наличие "дополнительного" на название параметра.

44
ответ дан Kalid 20 March 2017 в 17:38
поделиться

Я соглашаюсь с stephenbayer. Но так как это - веб-сервис, для конечного пользователя легче использовать всего одну форму webmethod, чем использование нескольких версий того же метода. Я думаю в этой ситуации, Типы Nullable идеально подходят для дополнительных параметров.

public void Foo(int a, int b, int? c)
{
  if(c.HasValue)
  {
    // do something with a,b and c
  }
  else
  {
    // do something with a and b only
  }  
}
8
ответ дан Vivek 20 March 2017 в 17:38
поделиться

Другая опция состоит в том, чтобы использовать ключевое слово

public void DoSomething(params object[] theObjects)
{
  foreach(object o in theObjects)
  {
    // Something with the Objects…
  }
}

параметрических усилителей, Названное как...

DoSomething(this, that, theOther);
124
ответ дан Robert Harvey 20 March 2017 в 17:38
поделиться

В C# я обычно использовал бы несколько форм метода:

void GetFooBar(int a) { int defaultBValue;  GetFooBar(a, defaultBValue); }
void GetFooBar(int a, int b)
{
 // whatever here
}

ОБНОВЛЕНИЕ: Это упомянуло выше, БЫЛ способ, которым я сделал значения по умолчанию с C# 2.0. Проекты я продолжаю работать теперь, используют C# 4.0, который теперь непосредственно поддерживает дополнительные параметры. Вот пример, который я просто использовал в своем собственном коде:

public EDIDocument ApplyEDIEnvelop(EDIVanInfo sender, 
                                   EDIVanInfo receiver, 
                                   EDIDocumentInfo info,
                                   EDIDocumentType type 
                                     = new EDIDocumentType(EDIDocTypes.X12_814),
                                   bool Production = false)
{
   // My code is here
}
75
ответ дан stephenbayer 20 March 2017 в 17:38
поделиться

Вы могли использовать перегрузку метода...

GetFooBar()
GetFooBar(int a)
GetFooBar(int a, int b)

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

Вы могли использовать типы Nullable...

GetFooBar(int? a, int? b)

Вы могли тогда проверить, с помощью a. HasValue, чтобы видеть, был ли параметр установлен.

Другая опция состояла бы в том, чтобы использовать 'params' параметр.

GetFooBar(params object[] args)

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

25
ответ дан Palec 20 March 2017 в 17:38
поделиться

Используя перегрузки или C# 4.0 использования или выше

 private void GetVal(string sName, int sRoll)
 {
   if (sRoll > 0)
   {
    // do some work
   }
 }

 private void GetVal(string sName)
 {
    GetVal("testing", 0);
 }
2
ответ дан Morpheus 17 September 2019 в 07:00
поделиться
  • 1
    Thnak Вы, да, я прочитал документ после задавания моего вопроса!!! Так или иначе желание, которое я мог использовать flashdata, потому что реальное среднее в таких целях flashdata, не нормальная сессия. Другая причина состоит в том, что теперь я должен использовать его более ручной путь, потому что я должен думать о сбрасывании сессий сообщения после отображения их. – Mohammad Naji 28 October 2012 в 14:42

В случае, когда значения по умолчанию не доступны, способ добавить дополнительный параметр состоит в том, чтобы использовать.NET класс OptionalAttribute - https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute? пример view=netframework-4.8

кода ниже:

namespace OptionalParameterWithOptionalAttribute
{
    class Program
    {
        static void Main(string[] args)
        {
            //Calling the helper method Hello only with required parameters
            Hello("Vardenis", "Pavardenis");
            //Calling the helper method Hello with required and optional parameters
            Hello("Vardenis", "Pavardenis", "Palanga");
        }
        public static void Hello(string firstName, string secondName, 
            [System.Runtime.InteropServices.OptionalAttribute] string  fromCity)
        {
            string result = firstName + " " + secondName;
            if (fromCity != null)
            {
                result += " from " + fromCity;
            }
            Console.WriteLine("Hello " + result);
        }

    }
}
0
ответ дан 22 November 2019 в 23:01
поделиться

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

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

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

0
ответ дан 22 November 2019 в 23:01
поделиться

У меня есть веб-служба для записи, которая принимает 7 параметров. Каждый из них является необязательным атрибутом запроса к sql-оператору, обёрнутому этим веб-сервисом. Таким образом, на ум приходят два обходных пути к неопциональным параметрам... оба довольно бедные:

method1(параметр1, параметр2, параметр3, параметр4, параметр5, параметр6, параметр7). метод1(параметр1, параметр2, параметр3, параметр4, параметр5, параметр6) метод 1(параметр1, параметр2, параметр3, параметр4, параметр5, параметр7)... начинайте видеть картинку. Таким образом, лежит безумие. Слишком много комбинаций.

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

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

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

0
ответ дан 22 November 2019 в 23:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: