如何判断字段是否是自动实现属性的后备字段?

时间:2009-10-20 10:53:31

标签: .net reflection

我正在使用反射来访问和存储属性和字段。但是,为了避免冗余数据,我想摆脱自动实现的属性的支持字段,这些字段也被枚举为普通字段。看起来这些支持字段被命名为“{PropertyName} k_BackingField”,看起来我只能解析这个字符串,但我想知道是否有一种更好的方法,而不是依赖于编译器提供的内部错位名称。

感谢。

2 个答案:

答案 0 :(得分:7)

至少对于我的类,编译器使用CompilerGenerated attribute注释那些自动属性支持字段。我想你可以检查一下。

答案 1 :(得分:5)

那么,您可以检查它是否是有效的C#标识符。如果不是,这是一个非常好的指标,它是一个自动属性。实际上,如果您知道它将由特定版本的特定编译器编译,那么可能依赖于命名模式。听起来有点脆弱。

更强大,如果您只是想知道它是否是编译器生成的,请检查FieldInfo是否已应用CompilerGeneratedAttribute。现在还有一些时候编译器会为你生成额外的字段 - 例如缓存用lambda表达式创建的委托,这些表达式不需要任何额外的上下文 - 但它至少表明它不是开发人员显式声明的字段(除非他们当然也明确地应用了这个属性。