c# - 如何从 C# ExpandoObject 按名称动态获取属性?

标签 c# asp.net oop dynamic reflection

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

例如,我可以这样做:

account.features.isEmailEnabled;

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

所以我想做的是:

account.features.GetProperty("isEmailEnabled");

并让它返回 true。

原因是我有很多功能,我希望能够编写一个通用的 getter 方法,我可以在其中传入我想要的功能的名称,该方法会将 account.features 的值传回给我.whatever(其中“whatever”是通过将字符串传递给通用 getter 方法来指定的)。否则我将不得不为每个功能编写 30 多个 getter。

我做了很多研究并尝试做类似的事情:

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

其次是

var value = prop.GetProperty(featureNameAsString); 

但是 value 总是返回 null。我不明白为什么。在监 window 口中,我可以执行 account.features.isEmailEnabled,它显示 true 并表示它是一个 bool 值。但是,如果我尝试使用上述方法获取此值并将 isEmailEnabled 作为 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;

关于c# - 如何从 C# ExpandoObject 按名称动态获取属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19139417/

相关文章:

c# - 下拉 SelectedValue 更改不相关的属性

c# - 在构建了所有子类之后,如何在父类(super class)中执行一些代码?

java - 领域模型金融交易应用

c# - Oracle 通过 ADO.NET (C#) 批量插入 - 不能使用 ODP

c# - 在 ASP.NET MVC Controller 之间共享代码

c# - 使用更新面板从代码后面更改 CSS 类 - 不起作用

javascript - 禁用隐藏字段的RequiredFieldValidator

c# - 单例设计模式是获得数据库连接的首选

c# - 使用 MiniDump (DbgHelp.h) 获取句柄数据

c# - 如何检查具有相同值的列表是否存在