我正在使用Reflection进行一些动态代码生成,并且我遇到了一种情况,我需要获取属性的支持字段(如果有的话)才能使用它的FieldInfo对象.
现在,我知道你可以使用
.IsDefined(typeof(CompilerGeneratedAttribute), false);
Run Code Online (Sandbox Code Playgroud)
在FieldInfo上发现它是否是自动生成的,所以我假设属性类似于自动生成字段?
干杯,艾德
该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)