2013-10-02 52 views
28

我有一個ExpandoObject並且想爲它創建一個getter,它將在運行時按名稱返回一個屬性,其中名稱是在字符串中指定的,而不是硬編碼。如何從C#ExpandoObject的名稱動態獲取屬性?

例如,我可以這樣做:

account.features.isEmailEnabled; 

,並且將返回true。 accountExpandoObject,並且features也是ExpandoObject。所以我有一個ExpandoObject,其中包含其他ExpandoObjects

所以我希望能夠做的是:

account.features.GetProperty("isEmailEnabled"); 

,並有真正的回報。

原因是我有很多功能,我希望能夠編寫一個通用的getter方法,我可以傳入我想要的功能的名稱,並且該方法會將我的值傳回給帳戶。 features.whatever(其中「whatever」是通過將字符串傳遞給泛型getter方法來指定的)。否則,我將不得不爲每個功能編寫30個一組的getters。

我做了很多的研究,並試圖做這樣的事情:通過

var value = prop.GetProperty(featureNameAsString); 

value

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

其次總是回來爲空。我不明白爲什麼。在觀察窗口中,我可以做account.features.isEmailEnabled,它顯示爲真,並說它是一個布爾值。但是,如果我嘗試使用上述方法得到此值,並通過isEmailEnabled作爲featureNameAsString,我只能得到空值。

有人可以告訴我我可能做錯了什麼,什麼是好方法,沒有太複雜?

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

回答

51

ExpandoObject都通過dynamic,並通過IDictionary<string,object>提供訪問 - 所以你可以只使用字典API:

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

如果該名稱是固定的,只是:

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