C# 反射:从PropertyInfo获取FieldInfo

C# 反射:从PropertyInfo获取FieldInfo,c#,reflection,C#,Reflection,我正在使用反射进行一些动态代码生成,我遇到了这样一种情况:如果某个属性有支持字段,我需要获取该属性的支持字段,以便使用它的FieldInfo对象 现在,我知道你可以用 .IsDefined(typeof(CompilerGeneratedAttribute), false); 在FieldInfo上查找是否自动生成,所以我假设对于自动生成字段的属性也有类似的情况 Cheers,Ed没有内置的方法来执行此操作,因为属性的存在并不一定保证支持字段的存在 我发现这解释了一种方法。它涉及获取属性set

我正在使用反射进行一些动态代码生成,我遇到了这样一种情况:如果某个属性有支持字段,我需要获取该属性的支持字段,以便使用它的FieldInfo对象

现在,我知道你可以用

.IsDefined(typeof(CompilerGeneratedAttribute), false);
在FieldInfo上查找是否自动生成,所以我假设对于自动生成字段的属性也有类似的情况


Cheers,Ed

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

我发现这解释了一种方法。它涉及获取属性setter的IL并对其进行解析,以查找已设置字段的证据。

属性的get_uuu和set_uuuuu方法还将CompilerGeneratedAttribute应用于它们。虽然属性之间没有强耦合,但自动特性的支持字段使用了命名约定:

public string Foo { get; set;}
生成一个私有字符串k__BackingField成员,此处是名称的一部分,因为它们在IL中是合法的,但在C中不是;它们与泛型无关

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

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) 
   });
安德鲁是对的

实际上,属性只是一个指向方法的指针,通常是由VisualStudio或其他高级语言生成的getter/setter

不过,解析setter并不容易。而且,由于内部setter只是另一种普通方法,它们可以使用多个字段,或者根本不使用,甚至可以调用其他方法。
也许你可以为常见的场景想出一个解决方案,但你必须解析IL字节码。

从他的问题看来,他指的是自动属性,它可以可靠地链接到支持字段。是的,我知道属性只是访问器方法的抽象,但我假设编译器会在自动生成的get上加上一个标志;方法,方式与字段相同。看来情况并非如此@Ed:编译器确实将CompilerGeneratedAttribute应用于get_uu和set_uu方法。@Adam抱歉,是的,在我阅读时完全跳过了你答案的第一部分。我没有加载该博客。使用Wayback机器,我得到了一个存档版本,它说代码已经转移到了它自己的项目中:这是我以前关于这个问题的回答:我不确定这是否足够可靠,是否有其他实例会将此标志添加到方法?@Ed:没有实例会将其添加到与属性关联的方法中。除非在C编译器的未来版本中有什么变化,否则这种方法是100%可靠的。这种方法对其他编译器生成的代码也是有效的还是只对C有效?