簡體   English   中英

如何從C#ExpandoObject按名稱動態獲取屬性?

[英]How to dynamically get a property by name from a C# ExpandoObject?

我有一個ExpandoObject ,想要為其做一個吸氣劑,該吸氣劑將在運行時按名稱返回屬性,該名稱是在字符串中指定的,而不是硬編碼的。

例如,我可以這樣做:

account.features.isEmailEnabled;

那將返回true。 accountExpandoObjectfeatures也是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通過dynamicIDictionary<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM