反思:从PropertyInfo获取FieldInfo

Ed *_*mes 2 c# reflection

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

现在,我知道你可以使用

.IsDefined(typeof(CompilerGeneratedAttribute), false);
Run Code Online (Sandbox Code Playgroud)

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

干杯,艾德

Ada*_*son 8

该get_和set_方法的属性也得到了CompilerGeneratedAttributed适用于他们.虽然通过属性没有强耦合,但是有一个命名约定用于auto属性的支持字段:

public string Foo { get; set;}
Run Code Online (Sandbox Code Playgroud)

产生private string <Foo>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) 
   });
Run Code Online (Sandbox Code Playgroud)