2016-11-03 1 views
5

私は新しいc#6演算子のnameofを使って、暗黙的にparams配列からキー/値の辞書を構築できると考えました。一例として、nameof演算子を使用してparams配列のパラメータの名前を暗示することは可能ですか?

、以下のメソッド呼び出し考える:私はparams配列から、要素の名前を意味することができるようになりますテストの実装があるだろうことを確認していない

string myName = "John", myAge = "33", myAddress = "Melbourne"; 
Test(myName, myAge, myAddress); 

を。

nameofを反射せずにこれを行う方法はありますか?

private static void Test(params string[] values) 
{ 
    List<string> keyValueList = new List<string>(); 

    //for(int i = 0; i < values.Length; i++) 
    foreach(var p in values) 
    { 
     //"Key" is always "p", obviously 
     Console.WriteLine($"Key: {nameof(p)}, Value: {p}"); 
    } 
} 
+3

'nameof'はコンパイル時の機能であり、実行時の機能ではありません。 –

+0

コンパイルされたILに 'myName'、' myAge'などが存在する必要はありません。それが存在しなければ、それは得られない。 –

答えて

3

いいえ、それはできません。あなたは使用される変数名の知識がありません。そのような情報は着呼者に渡されない。

あなたはこのように欲しいものを達成できる:

private static void Test(params string[][] values) 
{ 
    ... 
} 

public static void Main(string[] args) 
{ 
    string myName = "John", myAge = "33", myAddress = "Melbourne"; 
    Test(new string[] { nameof(myName), myName }); 
} 

または辞書使用:別の可能性は、の使用であろう

private static void Test(dynamic values) 
{ 
    var dict = ((IDictionary<string, object>)values); 
} 

public static void Main(string[] args) 
{ 
    dynamic values = new ExpandoObject(); 
    values.A = "a"; 
    Test(values); 
} 

private static void Test(Dictionary<string, string> values) 
{ 
    ... 
} 

public static void Main(string[] args) 
{ 
    string myName = "John", myAge = "33", myAddress = "Melbourne"; 
    Test(new Dictionary<string, string> { { nameof(myName), myName }, { nameof(myAge), myAge} }); 
} 

またはdynamicを使用してメソッドに渡すExpressionです。ここで式から変数名を抽出し、その値の式を実行できます。

+0

私は辞書を使用していますが、私はちょうど "よりスマート"なオーバーロードを作成することを考えました。 – Veverke

+0

さて、表現が便利になるかもしれません。しかし、私が思う最後の手段としてさらに。 –

+0

"スマート"なものと匿名のタイプを使い、辞書や名前のコレクションに変換する場合は、 –

関連する問題