web-dev-qa-db-ja.com

ループDynamicObjectプロパティ

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;
}

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

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

43
joeriks

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

14
Anuraj

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メンバーに加えて)DynamicObjectのみがパブリックとして宣言されているため、内部辞書にアクセスしてそれらの値を簡単に取得するためにリフレクションを使用する必要があります(意図しない場合)さらに変更する場合)。

47
Jeff Mercado