【问题标题】:How can I get class fields through reflection when backing fields are present?当存在支持字段时,如何通过反射获取类字段?
【发布时间】:2013-10-24 23:03:56
【问题描述】:

我有一个简单的 POCO 类,例如

class C {
  [MyAtrib]
  public int i {get; set;}
  [MyAtrib]  
  public int i2;
}

当我打电话时:

GetType().GetFields(
  BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

在那个类(实例)上,对于那些自动生成 getter/setter(即上面的 int i)的成员,我无法获得 FieldInfo

实际上,我正在尝试读取那些自定义属性 (MyAtrib),但对于那些具有 {get; set;} 的属性却无法读取。

这是为什么呢?我希望同时获得i 和它的(私有)支持字段,因为i 是公开的。

我可以通过反射到达iMyAtrib 吗?

【问题讨论】:

  • 那些有getter和setter的不是字段;它们是属性。
  • 你肯定得到了支持字段,使用 BindingFlags.NonPublic 就足够了。它有一个难以形容的名字,<i>k__BackingField。该属性应用于支持字段,它存在于属性中。需要调用 GetProperty() 来检索它。

标签: c# reflection custom-attributes backing-field


【解决方案1】:

您现在获得字段,但 public int i {get; set;} 是一个属性。 您需要获取属性:

// note: properties -> generally public
GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2011-08-20
    • 2020-08-04
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多