C# 如何确定属性是否是具有反射的自动实现的属性?
所以在我的例子中,我使用反射来发现一个类的结构。我需要能够确定属性是否是PropertyInfo对象自动实现的属性。我假设反射API不公开此类功能,因为自动属性依赖于C,但是否有任何解决方法来获取此信息?您可以检查C# 如何确定属性是否是具有反射的自动实现的属性?,c#,.net,reflection,automatic-properties,C#,.net,Reflection,Automatic Properties,所以在我的例子中,我使用反射来发现一个类的结构。我需要能够确定属性是否是PropertyInfo对象自动实现的属性。我假设反射API不公开此类功能,因为自动属性依赖于C,但是否有任何解决方法来获取此信息?您可以检查get或set方法是否标记有CompilerGenerated属性。然后,您可以将其与查找带有CompilerGenerated属性(包含属性名称和字符串“BackingField”)标记的私有字段相结合 也许: public static bool MightBeCouldBeMay
get
或set
方法是否标记有CompilerGenerated
属性。然后,您可以将其与查找带有CompilerGenerated
属性(包含属性名称和字符串“BackingField”
)标记的私有字段相结合
也许:
public static bool MightBeCouldBeMaybeAutoGeneratedInstanceProperty(
this PropertyInfo info
) {
bool mightBe = info.GetGetMethod()
.GetCustomAttributes(
typeof(CompilerGeneratedAttribute),
true
)
.Any();
if (!mightBe) {
return false;
}
bool maybe = info.DeclaringType
.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Where(f => f.Name.Contains(info.Name))
.Where(f => f.Name.Contains("BackingField"))
.Where(
f => f.GetCustomAttributes(
typeof(CompilerGeneratedAttribute),
true
).Any()
)
.Any();
return maybe;
}
它不是傻瓜式的,非常易碎,可能无法移植到(比如)Mono上。这应该可以:
public static bool IsAutoProperty(this PropertyInfo prop)
{
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
由于字符
不会出现在普通字段中,因此具有此类命名的字段指向自动属性的支持字段。正如杰森所说,它仍然易碎
或者让它快一点
public static bool IsAutoProperty(this PropertyInfo prop)
{
if (!prop.CanWrite || !prop.CanRead)
return false;
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
public static bool IsAutoProperty(此属性info prop)
{
如果(!prop.CanWrite | |!prop.CanRead)
返回false;
返回prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f=>f.Name.Contains(“”);
}
非常感谢Jason,反射器同时也告诉我:)应该早一点想到。@3o4eTo:这不是傻瓜式的,易碎的,可能无法移植到Mono上。如果属性上没有getter,也要注意例外情况。是的。为什么我们需要检查属性?除了其他限制,这只适用于C#生成的自动道具。VB.NET编译器使用的模式只是将前缀\uu
放在自动属性名称上,但确实包含CompilerGeneratedAttribute
属性。F#编译器不使用apply属性,而是使用另一种命名约定。
public static bool IsAutoProperty(this PropertyInfo prop)
{
if (!prop.CanWrite || !prop.CanRead)
return false;
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}