45

DynamicObject タイプを理解しようとしています。この MSDN の記事は、DynamicObject の作成方法と使用方法が非常に簡潔で明確であることがわかりました。

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx

この記事には、DynamicObject から継承する単純な DynamicDictionary クラスが含まれています。

ここで、動的に作成された DynamicObject プロパティを反復処理します。

dynamic d = new DynamicDictionary();
d.Name = "Myname";
d.Number = 1080;

foreach (var prop in d.GetType().GetProperties())
{
  Console.Write prop.Key;
  Console.Write prop.Value;
}

明らかにそれはうまくいきません。DynamicObject から継承するすべての種類の既存のオブジェクトに対してこれを使用する方法を実際に学ぼうとしているので、DynamicDictionary クラスを変更せずにこれを行う方法を学びたいと思っています。

リフレクションは必要ですか?私は何かが欠けているに違いない...

4

3 に答える 3

51

ExpandoObjectクラスに興味があると思います。DynamicObjectクラスは、すべてのロジックを提供するための単なるベースです。インターフェイスを明示的に実装しているIDictionary<string, object>ため、プロパティにアクセスしたり、新しいプロパティを追加したりできます。

// declare the ExpandoObject
dynamic expObj = new ExpandoObject();
expObj.Name = "MyName";
expObj.Number = 1000;

// print the dynamically added properties
foreach (KeyValuePair<string, object> kvp in expObj) // enumerating over it exposes the Properties and Values as a KeyValuePair
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);

// cast to an IDictionary<string, object>
IDictionary<string, object> expDict = expObj;

// add a new property via the dictionary reference
expDict["Foo"] = "Bar";

// verify it's been added on the original dynamic reference
Console.WriteLine(expObj.Foo);

あなたがクラスを実装していることに気づき、DynamicDictionaryあなたの質問を誤解しました。ごめん。

動的参照で使用すると、公開されているメンバーにのみアクセスできます。Count(他のメンバーに加えて) publicのみが宣言さDynamicObjectれているため、内部辞書にアクセスしてこれらの値を簡単に取得するには、リフレクションを使用する必要があります (これ以上変更を加えるつもりがない場合)。

于 2011-01-27T09:25:19.077 に答える
15

DynamicDictionary.GetDynamicMemberNames() メソッドを試しましたか? - http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.getdynamicmembernames.aspx

于 2011-01-27T09:25:13.167 に答える