reflection:从PropertyInfo获取FieldInfo

我正在使用Reflection进行一些动态代码生成,并且我遇到了一种情况,我需要获取属性的支持字段(如果它有一个)以便使用它的FieldInfo对象。

现在,我知道你可以使用

.IsDefined(typeof(CompilerGeneratedAttribute), false); 

在FieldInfo上发现它是否是自动生成的,所以我假设属性类似于自动生成字段?

干杯,艾德

属性的get_set_方法也会将CompilerGeneratedAttributed应用于它们。 虽然通过属性没有强耦合,但是有一个用于auto属性的支持字段的命名约定:

 public string Foo { get; set;} 

生成一个private string k__BackingField成员( <>这里是名称的一部分,因为它们在IL中合法但在C#中不合法;它们与generics无关)。

例如,这将获得一个类中所有自动属性的列表,以及它们的支持字段:

 t.GetProperties().Where(p => (p.GetGetMethod() ?? p.GetSetMethod()).IsDefined(typeof(CompilerGeneratedAttribute), false)) .Select(p => new { Property = p, Field = t.GetField(string.Format("<{0}>k__BackingField", p.Name), System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) }); 

没有内置的方法来执行此操作,因为属性的存在不一定保证存在后备字段。

我发现这篇文章解释了一种做法。 它涉及获取属性的setter的IL并解析它以查找正在设置的字段的证据。

安德鲁是对的。

实际上,属性只是方法的“指针”,通常是由Visual Studio或其他高级语言(大多数时候)生成的getter / setter。

但是,解析二传手并不容易。 而且,由于内部setter只是另一种vanilla方法,它们可以使用多个字段,或者根本不使用,甚至可以调用其他方法。 也许您可以为常见方案提出解决方案,但您必须解析IL字节码。