use*_*966 37 c# asp.net oop reflection dynamic
我有一个ExpandoObject并且想要为它创建一个getter,它将在运行时按名称返回一个属性,其中名称以字符串形式指定而不是硬编码.
例如,我可以这样做:
account.features.isEmailEnabled;
Run Code Online (Sandbox Code Playgroud)
这将返回真实. account是一个ExpandoObject,features也是一个ExpandoObject.所以我有一个ExpandoObject包含其他的ExpandoObjects.
所以我想要做的是:
account.features.GetProperty("isEmailEnabled");
Run Code Online (Sandbox Code Playgroud)
并让它返回真实.
原因是我有很多功能,我希望能够编写一个通用的getter方法,我可以在其中传递我想要的功能的名称,该方法将传递给我的值为account.features.whatever(通过将字符串传递给泛型getter方法指定"whatever".否则,我将不得不为每个功能写一个30个吸气剂.
我做了很多研究并尝试过这样的事情:
var prop = account.features.GetType();
// this returns System.Dyanmic.ExpandoObject
Run Code Online (Sandbox Code Playgroud)
其次是
var value = prop.GetProperty(featureNameAsString);
Run Code Online (Sandbox Code Playgroud)
但value总是回来为null.我不明白为什么.在观察窗口我可以做account.features.isEmailEnabled,它显示为真,并说它是一个布尔值.但是,如果我尝试使用上面的方法获得此值并传入,isEmailEnabled因为featureNameAsString我只是得到null.
有人可以告诉我,我可能做错了什么,什么是好方法,而不是太复杂?
我在4.5.1框架下使用ASP.NET.
Mar*_*ell 70
ExpandoObject提供via dynamic和via 访问IDictionary<string,object>- 所以你可以使用字典API:
var byName = (IDictionary<string,object>)account.features;
bool val = (bool)byName["isEmailEnabled"];
Run Code Online (Sandbox Code Playgroud)
或者,如果名称是固定的,只需:
bool val = ((dynamic)account).features.isEmailEnabled;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27343 次 |
| 最近记录: |