2011-01-27 6 views
42

DynamicObject型を理解しようとしています。このMSDNの記事は、DynamicObjectを作成して使用する方法として非常にconsiseかつ明確であることが判明:Loop 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クラスの変更なしでこれを行う方法を学びたいと思います。

反射が必要ですか?私は何かが欠けている必要があります...

答えて

14

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

+0

よさそうだ - しかし、私は/私のクラスと「GetDynamicMemberNamesを(変更することはできませんしたくない)オプションのことですが、それは望んでいる場合DynamicObjectから継承したクラスは、それを上書きすることができ、それがベースに機能しない場合、すなわち空のリストを返すクラスが呼び出されます。 " – joeriks

+0

ええと、私は理解しています。それから、ExpandoObjectのために移動する必要があるか、またはそれを自分で実装する必要があると思います。 – Anuraj

+0

私は、おかげで、とても[OK]を – joeriks

45

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

+0

...私には、まったく助けませんでした、ありがとう – joeriks

+0

AFAIKはい。あなたはパブリックメンバーにアクセスすることができ、 'DynamicObject'クラスはメンバーアクセスが様々な方法で解決されます。また、明示的にこのプロセスを容易にする 'のIDictionary <文字列、オブジェクト>'ちょうどExpandoObjectのようなクラスを実装することができます。 –

+0

p.s.、申し訳ありません最初にあなたの質問を光らせました。サンプルコードを実際に実装していることに気付かなかった。私は「...何の 'DynamicDictionary'クラスはありません」、自分自身に考えていた:)私は見 –

関連する問題