[英]How to dynamically get a property by name from a C# ExpandoObject?
我有一個ExpandoObject
,想要為其做一個吸氣劑,該吸氣劑將在運行時按名稱返回屬性,該名稱是在字符串中指定的,而不是硬編碼的。
例如,我可以這樣做:
account.features.isEmailEnabled;
那將返回true。 account
是ExpandoObject
, features
也是ExpandoObject
。 所以我有一個ExpandoObject
包含其他ExpandoObjects
。
所以我想做的是這樣的:
account.features.GetProperty("isEmailEnabled");
並返回真。
原因是我具有許多功能,並且我希望能夠編寫一個通用的getter方法,以便在其中傳遞所需功能的名稱,並且該方法會將我的值傳遞回account.features.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
傳入, featureNameAsString
我只會得到null。
有人可以告訴我我做錯了什么,什么是好的方法,而又不要太復雜?
我正在4.5.1框架下使用ASP.NET。
ExpandoObject
通過dynamic
和IDictionary<string,object>
提供訪問權限-因此您可以使用字典API:
var byName = (IDictionary<string,object>)account.features;
bool val = (bool)byName["isEmailEnabled"];
或者,如果名稱是固定的,則只需:
bool val = ((dynamic)account).features.isEmailEnabled;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.