循环DynamicObject属性

joe*_*iks 43 c# 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;
}
Run Code Online (Sandbox Code Playgroud)

显然这不起作用.我想学习如何在不改变DynamicDictionary类的情况下做到这一点,因为我真的想学习如何将它用于从DynamicObject继承的各种现有对象.

需要反思吗?我肯定错过了什么...

Jef*_*ado 47

我相信你会对这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);
Run Code Online (Sandbox Code Playgroud)

我刚刚意识到你正在实施DynamicDictionary课程并误解了你的问题.抱歉.

与动态参考一起使用时,您只能访问公开公开的成员.由于只是Count声明为public(除了其他DynamicObject成员),因此您需要使用反射来访问内部字典以轻松获取这些值(如果您不打算进行任何进一步的更改).


Anu*_*raj 14

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