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