4

私はActionScriptで多くの作業を行い、C#と非常によく似ていることを嬉しく思いましたが、欠けていることが1つあります。それは、「動的参照」です。

たとえば、動的参照は配列演算子[]を使用して実行できます。したがって、たとえばsome_thing.something_else、次の2つの方法でプロパティにアクセスすることもできます。

some_thing["something_else"]
// or

some_thing[some_var] // where some_var is a variable holding a string
// e.g.: some_var = "something_else";

つまり、配列の構文は、プロパティ自体を指定することと同じです。

オブジェクトを動的に参照するもう1つのオプションは、eval()グローバル関数を使用することです。

だから、私の質問:ActionScriptと同様の方法でC#のプロパティを参照することは可能ですか?

4

2 に答える 2

6

これを行うために私が見ることができる唯一の方法は、ダイナミクス、特にを使用することExpandoObjectです。クラスを使用すると、次のExpandoObjectようなことができます。

dynamic employee;

employee = new ExpandoObject();
employee.Name = "John Smith";
employee.Age = 33;

これらemployeeのプロパティはありませんが、このコードはコンパイルされて機能します。それが機能するだけでなく、動的プロパティも強く型付けされます。

キーによるプロパティへのアクセスも簡単です。 ExpandoObjectを実装IDictionary<string,object>しているので、ダウンキャストと同じくらい簡単です。

var dictEmployee = employee as IDictionary<string,object>;
Debug.WriteLine(dictEmployee["Age"].ToString);

このコードにより33、デバッグ出力に出力されます。

この方法を広く使用することはお勧めしませんが、場合によっては便利です。

于 2012-08-05T06:46:23.063 に答える
1

evalC#にはありません。

あなたの質問の最初の部分について。以下はC#で完全に可能ですが

var key = "ouch";
Console.WriteLine(something[key]);

言及する価値のある2つのことがあります。

  1. 少なくとも動的のC#の意味では、このコードには動的なものは何もありません
  2. somethingは配列ではなく、辞書です。
于 2012-08-05T06:35:00.073 に答える