2009-03-08 15 views
2

C#3.0のようにオプションのパラメータを追加する方法はありますか?私はこの機能を持っている、私はちょうど待つことができない!C#3.0の名前付き/オプションのパラメータ?

編集:

あなたが仕事アラウンド/これを達成するためにハックを知っていれば、またそれを投稿。ありがとう!

答えて

13

あなたが名前付きパラメータの回避策として、匿名型と反射を使用することができます。

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を呼び出すことができます。

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

...それは私のメッセージを書くでしょう。

基本的には、渡された匿名型からすべてのプロパティを抽出し、文字列とオブジェクトの辞書(プロパティの名前とその値)に変換しています。

+0

これを実際に使っているのは私には見えませんが、かなり賢いです。もちろん、反射オーバーヘッドを避けるために、非匿名型を使用することもできます。 –

+0

私は、月曜日に仕事に戻る前に、これで済ますことができるすべてのクールなものを巡回していることを確認するつもりです。非常に賢い! – scwagner

+0

+1、うわー、それはかなりクールです。 –

8

残念ながら、これをサポートするにはC#4.0コンパイラが必要です。今日の.NETプラットフォームでオプションのパラメータが必要な場合は、VB .NETまたはF#を試すことができます。

8

常にメソッドのオーバーロードがあります。 :)

4

ダスティン氏によると、オプションのパラメータはC#4.0にあります。オプションのパラメータをシミュレートするためのある種の厄介な方法は、最後の引数としてオブジェクト[](またはより強く型付けされた配列)を持つことです。

+0

最後のobject []引数の前に 'params'キーワードを使用すると、呼び出すのが簡単なものもあります。 –