我正在使用反射生成一些动态代码,我遇到过这样一种情况,我需要获取属性的支持字段(如果它有的话)以便使用它的 FieldInfo 对象。
现在,我知道你可以使用
.IsDefined(typeof(CompilerGeneratedAttribute), false);
在 FieldInfo 上发现它是否是自动生成的,所以我假设自动生成字段的 Properties 也有类似的东西?
干杯,埃德
最佳答案
get_
和 set_
属性的方法也得到 CompilerGeneratedAttributed
应用于他们。虽然通过属性没有强耦合,但有一个命名约定用于自动属性的支持字段:
public string Foo { get; set;}
产生 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)
});
关于c# - 反射(reflection):从 PropertyInfo 获取 FieldInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2675975/