Именованные / Необязательные параметры в C # 3.0? - PullRequest
2 голосов
/ 08 марта 2009

Есть ли способ добавить дополнительные параметры в C # 3.0, как это будет в C # 4.0? Мне нужна эта функция, я просто не могу ждать!

Edit:

Если вы знаете обходной путь / хакерство для достижения этой цели, опубликуйте его также. Спасибо!

Ответы [ 5 ]

13 голосов
/ 08 марта 2009

Вы можете использовать анонимный тип и отражение в качестве обходного пути к именованным параметрам:

public void Foo<T>(T parameters)
{
    var dict = typeof(T).GetProperties()
        .ToDictionary(p => p.Name, 
            p => p.GetValue(parameters, null));

    if (dict.ContainsKey("Message"))
    {
        Console.WriteLine(dict["Message"]);
    }
}

Так что теперь я могу звонить Фу так:

Foo(new { Message = "Hello World" });

... и он напишет мое сообщение.

В основном я извлекаю все свойства из переданного анонимного типа и преобразовываю их в словарь строк и объектов (имя свойства и его значение).

9 голосов
/ 08 марта 2009

Всегда есть перегрузка метода. :)

8 голосов
/ 08 марта 2009

К сожалению, нет. Вам понадобится компилятор C # 4.0 для поддержки этого. Если вам нужны дополнительные параметры на платформе .NET сегодня, вы можете попробовать VB .NET или F #.

4 голосов
/ 08 марта 2009

Как сказал Дастин, необязательные параметры появятся в C # 4.0. Одним из дурацких способов симуляции необязательных параметров было бы использование объекта [] (или более строго типизированного массива) в качестве последнего аргумента.

2 голосов
/ 08 марта 2009

Можно также использовать переменные аргументы в качестве параметров опции. Примером того, как это работает, является string.Format ().

Смотрите здесь:

http://blogs.msdn.com/csharpfaq/archive/2004/05/13/131493.aspx

...