一尘不染

如何反映动态对象的成员?

c#

我需要从使用.NET 4中的dynamic关键字声明的对象中获取属性及其值的字典吗?似乎为此使用反射将不起作用。

例:

dynamic s = new ExpandoObject();
s.Path = "/Home";
s.Name = "Home";

// How do I enumerate the Path and Name properties and get their values?
IDictionary<string, object> propertyValues = ???

阅读 267

收藏
2020-05-19

共1个答案

一尘不染

如果IDynamicMetaObjectProvider可以提供动态成员名称,则可以获取它们。请参阅apache许可的PCL库Dynamitey(可以在nuget中找到)中的GetMemberNames实现,它适用于实现的s和s
以及任何其他提供了meta对象的实现而无需进行自定义测试的对象。ExpandoObject``DynamicObject``GetDynamicMemberNames``IDynamicMetaObjectProvider``GetDynamicMemberNames``is IDynamicMetaObjectProvider

在获得成员名称之后,要以正确的方式获得价值还需要做更多的工作,但是Impromptu可以做到这一点,但是要指出有趣的部分并使其有意义就更加困难了。这是文档,它等于或比反射更快,但是,它不可能比对expando的字典查找要快,但是它适用于任何对象,expando,动态或原始对象-
随便命名。

2020-05-19