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

57

我有一个 ExpandoObject 对象,并想为它创建一个getter,在运行时通过名称返回属性,其中名称由字符串指定而不是硬编码。

例如,我可以这样做:

account.features.isEmailEnabled;

并且这将返回true。 account 是一个ExpandoObject,而features也是一个ExpandoObject。因此,我有一个包含其他ExpandoObjectsExpandoObject

所以我想做的是这样的:

account.features.GetProperty("isEmailEnabled");

原因是我有很多功能,并且我想能够编写一个通用的getter方法,在这个方法中,我可以传入我想要的功能名称,该方法将返回account.features.whatever的值(其中“whatever”由向通用getter方法传递字符串来指定)。否则,我将不得不为每个功能编写30多个getter。

我进行了大量的研究并尝试做一些像:

var prop = account.features.GetType();  
// this returns System.Dyanmic.ExpandoObject

随后是

var value = prop.GetProperty(featureNameAsString); 

但是value总是返回null。我不明白为什么。在观察窗口中,我可以执行account.features.isEmailEnabled并显示true,并表示它是布尔值。但是,如果我尝试使用上述方法获取此值并将isEmailEnabled作为featureNameAsString传递,我只会得到null。

请问有人能告诉我可能做错了什么以及一个好的方法(不要太复杂)吗?

我正在使用ASP.NET 4.5.1框架。

1个回答

109

ExpandoObject 可以通过 dynamicIDictionary<string,object> 两种方式进行访问 - 因此,您可以直接使用字典 API:

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

或者如果名称已经固定,只需:

bool val = ((dynamic)account).features.isEmailEnabled;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接