【问题标题】:How to dynamically get a property by name from a C# ExpandoObject?如何从 C# ExpandoObject 按名称动态获取属性?
【发布时间】:2013-10-08 23:37:15
【问题描述】:

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

例如,我可以这样做:

account.features.isEmailEnabled;

这将返回 true。 accountExpandoObjectfeatures 也是 ExpandoObject。所以我有一个ExpandoObject,其中包含其他ExpandoObjects

所以我想做的是:

account.features.GetProperty("isEmailEnabled");

并让它返回 true。

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

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

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

紧随其后

var value = prop.GetProperty(featureNameAsString); 

value 总是返回为空。我不明白为什么。在监视窗口中,我可以执行account.features.isEmailEnabled,它显示为真并表示它是一个布尔值。但是,如果我尝试使用上述方法获取此值并将isEmailEnabled 作为featureNameAsString 传递,我只会得到空值。

谁能告诉我我可能做错了什么以及什么是好的方法,而不是太复杂?

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

【问题讨论】:

    标签: c# asp.net oop dynamic reflection


    【解决方案1】:

    ExpandoObject 提供通过dynamicIDictionary<string,object> 的访问 - 所以您可以只使用字典 API:

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

    或者,如果名称是固定的,只需:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      相关资源
      最近更新 更多