48

私は を持っており、ExpandoObject実行時に名前でプロパティを返すゲッターを作成したいと考えています。名前はハードコーディングされているのではなく、文字列で指定されています。

たとえば、私はこれを行うことができます:

account.features.isEmailEnabled;

そしてそれはtrueを返します。 accountでありExpandoObject、またfeaturesですExpandoObject。だから私ExpandoObjectは other を含むを持っていますExpandoObjects

だから私ができるようにしたいのはこれです:

account.features.GetProperty("isEmailEnabled");

そしてそれがtrueを返すようにします。

その理由は、私には多くの機能があり、必要な機能の名前を渡すことができる 1 つの汎用ゲッター メソッドを記述できるようにしたいためです。メソッドは account.features.whatever の値を返します (ここで、"whatever" は、文字列をジェネリック getter メソッドに渡すことによって指定されます)。そうしないと、機能ごとに 30 個ほどのゲッターを作成する必要があります。

私は多くの研究を行い、次のようなことを試みました:

var prop = account.features.GetType();  
// this returns System.Dyanmic.ExpandoObject

に続く

var value = prop.GetProperty(featureNameAsString); 

ただし、value常に null として返されます。理由がわかりません。私ができるウォッチウィンドウでaccount.features.isEmailEnabled、それはtrueを示し、ブール値であると言います。しかし、上記のアプローチを使用してこの値を取得しようとすると、isEmailEnablednullfeatureNameAsStringになるだけです。

複雑すぎずに、私が間違っている可能性があることと、良いアプローチを教えてください。

4.5.1 フレームワークで ASP.NET を使用しています。

4

1 に答える 1

98

ExpandoObjectdynamicviaと viaの両方のアクセスを提供するIDictionary<string,object>ため、辞書 API を使用できます。

var byName = (IDictionary<string,object>)account.features;
bool val = (bool)byName["isEmailEnabled"];

または、名前が固定されている場合は、次のようにします。

bool val = ((dynamic)account).features.isEmailEnabled;
于 2013-10-02T14:31:14.870 に答える