如何查找属性是否具有编译器生成的后备字段?

时间:2016-05-03 14:56:23

标签: c# reflection

我有一个场景,我必须找出由PropertyInfo表示的特定属性是否具有编译器生成的支持字段。我需要这些信息来了解房产是否明确"计算。

我不能简单地使用GetSetMethod(true) != null条件,因为C#6引入了仅具有getter的属性,它似乎给出了null,但我仍然无法将它们视为计算。

例如

public class Test {

  public bool A { get; set; } // has a backing field, should give computed = false
  public int B { get; private set; } // has a backing field,should give computed = false
  public int C { get; } // has a backing field,should give computed = false;
  public bool D { get { return B + C > 10; } } // doesn't have backing field, should give computed = true 

  private int _e = 1;
  public int E { get { return _e; } } // has an explicit backing field, so in this sense it should give computed = true

  public Test() {
    B = 3;
    C = 5;
  }
}

我想写一个小扩展方法,比如这个

public static bool IsComputed(this PropertyInfo propertyInfo) {
  ...
}

修改

为了更清楚,在C#6之前,我使用简单的GetSetMethod(true) == null条件来处理属性"计算"。但是现在只有吸气剂的属性(有时用作私人吸气剂的替代品)会弄乱它,因为他们给出了null,因为他们没有设定方法,但他们不应该这样做被视为计算。

0 个答案:

没有答案