reflection:从PropertyInfo获取FieldInfo
我正在使用Reflection进行一些动态代码生成,并且我遇到了一种情况,我需要获取属性的支持字段(如果它有一个)以便使用它的FieldInfo对象。
现在,我知道你可以使用
.IsDefined(typeof(CompilerGeneratedAttribute), false);
在FieldInfo上发现它是否是自动生成的,所以我假设属性类似于自动生成字段?
干杯,艾德
属性的get_
和set_
方法也会将CompilerGeneratedAttributed
应用于它们。 虽然通过属性没有强耦合,但是有一个用于auto属性的支持字段的命名约定:
public string Foo { get; set;}
生成一个private string
成员( <
和>
这里是名称的一部分,因为它们在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字节码。