循环DynamicObject属性

我想了解DynamicObjecttypes。 发现这个MSDN文章是非常consise和清楚如何创build和使用DynamicObject:

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

本文包含一个从DynamicObjectinheritance的简单的DynamicDictionary类。

现在我想迭代我的dynamic创build的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类,因为我真的想学习如何使用它来inheritanceDynamicObject的所有types的现有对象。

reflection需要吗? 我肯定错过了什么…

你有没有尝试过DynamicDictionary.GetDynamicMemberNames()方法? – http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.getdynamicmembernames.aspx

我相信你会对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类,并误解了你的问题。 抱歉。

与dynamic参考一起使用时,您只能访问公开的成员。 由于只有Count被声明为public(除了其他的DynamicObject成员),所以你需要使用reflection来访问内部字典,以便轻松获取这些值(如果你不打算做进一步的修改)。