首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环DynamicObject属性

循环DynamicObject属性
EN

Stack Overflow用户
提问于 2011-01-27 17:13:57
回答 3查看 54.7K关注 0票数 45

我正在尝试理解DynamicObject类型。我发现这篇关于如何创建和使用DynamicObject的文章非常清楚:

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

本文包含一个继承自DynamicObject的简单DynamicDictionary类。

现在,我想遍历动态创建的DynamicObject属性:

代码语言:javascript
复制
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的所有类型的现有对象使用它。

是否需要反射?我一定是漏掉了什么。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-27 17:25:13

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

票数 15
EN

Stack Overflow用户

发布于 2011-01-27 17:25:19

我相信您会对ExpandoObject类感兴趣。DynamicObject类只是一个基础,您应该在其中提供所有的逻辑。它显式地实现了IDictionary<string, object>接口,因此您可以通过这种方式访问它的属性或添加新的属性。

代码语言:javascript
复制
// 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成员之外),您需要使用反射来访问内部字典来轻松地获取这些值(如果您不想做任何进一步的更改)。

票数 51
EN

Stack Overflow用户

发布于 2020-07-08 01:43:56

我知道这个话题很古老,但是对于那些仍然想知道如何做的人来说,为什么不使用TryGetMember()方法,而是构造一个继承GetMemberBinder的类,比如:

代码语言:javascript
复制
public class MyGetMemberBinder : GetMemberBinder
{
    public MyGetMemberBinder(string name, bool ignorecase) : base(name, ignorecase) { }
    public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion)=>throw new NotImplementedException();
}

然后使用LINQ:

代码语言:javascript
复制
Dictionary<string, object> AsStandardDictionary = DynamicDictionary.GetDynamicMemberNames().ToDictionary(x => x, y =>
{
    if(DynamicDictionary.TryGetMember(new MyGetMemberBinder(y, false), out var result))
        return result;
    else
        return null;
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4814472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档