48

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

例如,我可以这样做:

account.features.isEmailEnabled;

这将返回true。 account是一个ExpandoObjectfeatures也是一个ExpandoObject。所以我有一个ExpandoObject包含其他ExpandoObjects.

所以我想要做的是:

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总是返回为空。我不明白为什么。在监视窗口中,我可以做account.features.isEmailEnabled,它显示为真,并说它是一个布尔值。但是,如果我尝试使用上面的方法获得这个值并传入,isEmailEnabledfeatureNameAsString只会得到空值。

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

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

4

1 回答 1

98

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

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

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

bool val = ((dynamic)account).features.isEmailEnabled;
于 2013-10-02T14:31:14.870 回答