如何从C#ExpandoObject中按名称动态获取属性?

use*_*966 37 c# asp.net oop reflection dynamic

我有一个ExpandoObject并且想要为它创建一个getter,它将在运行时按名称返回一个属性,其中名称以字符串形式指定而不是硬编码.

例如,我可以这样做:

account.features.isEmailEnabled;
Run Code Online (Sandbox Code Playgroud)

这将返回真实. account是一个ExpandoObject,features也是一个ExpandoObject.所以我有一个ExpandoObject包含其他的ExpandoObjects.

所以我想要做的是:

account.features.GetProperty("isEmailEnabled");
Run Code Online (Sandbox Code Playgroud)

并让它返回真实.

原因是我有很多功能,我希望能够编写一个通用的getter方法,我可以在其中传递我想要的功能的名称,该方法将传递给我的值为account.features.whatever(通过将字符串传递给泛型getter方法指定"whatever".否则,我将不得不为每个功能写一个30个吸气剂.

我做了很多研究并尝试过这样的事情:

var prop = account.features.GetType();  
// this returns System.Dyanmic.ExpandoObject
Run Code Online (Sandbox Code Playgroud)

其次是

var value = prop.GetProperty(featureNameAsString); 
Run Code Online (Sandbox Code Playgroud)

value总是回来为null.我不明白为什么.在观察窗口我可以做account.features.isEmailEnabled,它显示为真,并说它是一个布尔值.但是,如果我尝试使用上面的方法获得此值并传入,isEmailEnabled因为featureNameAsString我只是得到null.

有人可以告诉我,我可能做错了什么,什么是好方法,而不是太复杂?

我在4.5.1框架下使用ASP.NET.

Mar*_*ell 70

ExpandoObject提供via dynamic和via 访问IDictionary<string,object>- 所以你可以使用字典API:

var byName = (IDictionary<string,object>)account.features;
bool val = (bool)byName["isEmailEnabled"];
Run Code Online (Sandbox Code Playgroud)

或者,如果名称是固定的,只需:

bool val = ((dynamic)account).features.isEmailEnabled;
Run Code Online (Sandbox Code Playgroud)