所以在我的情况下,我正在使用反射来发现类的结构。我需要能够通过PropertyInfo对象找出属性是否是自动实现的属性。我认为反射API不公开这样的功能,因为自动属性是C#依赖的,但是有没有解决方法来获取这些信息?如何找出属性是否是反射的自动实现的属性?
18
A
回答
16
您可以检查get
或set
方法是否标有CompilerGenerated
属性。然后,您可以将其与查找包含属性名称和字符串"BackingField"
的CompilerGenerated
属性标记的私有字段结合使用。
也许:
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;
}
这不是糊弄的证据,很脆,可能不便于携带,比方说,单声道。
7
这应该这样做:
public static bool IsAutoProperty(this PropertyInfo prop)
{
return prop.DeclaringType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
.Any(f => f.Name.Contains("<" + prop.Name + ">"));
}
的原因是,自动性的后盾FieldInfo
的Name
财产会是什么样子:
<PropertName>k__BackingField
由于字符<
和>
将不会出现对于普通字段,具有这种类型命名的字段指向自动属性的后台字段。正如杰森所说,它仍然脆弱。
或者使其稍快一点,
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 + ">"));
}
相关问题
- 1. 自动实现的属性是否支持属性?
- 2. 什么是自动实现的属性
- 3. 自动实现的属性
- 4. C#自定义属性属性反射
- 5. 自动实现的属性是否有隐含的集合?
- 6. 在C#中使用自动实现的属性是否正确?
- 7. 可以自动实现的属性是否有私有集合?
- 8. 属性和自动实现
- 9. 如何检查一个属性是否与反射虚拟?
- 10. 使用自动实现的属性或由我们自己实现属性
- 11. 找出是否反射场是易失性的
- 12. Javascript属性反射
- 13. 将常规属性转换为自动实现的属性
- 14. 使用属性反射测试属性
- 15. 反射,属性和属性选择
- 16. 用于自动实现的属性
- 17. C#中自动实现的属性
- 18. 自动实现的属性错误
- 19. 自定义实体映射是否可以配置父属性?
- 20. Java是否有自动属性?
- 21. 反思找出属性是否为期权类型
- 22. 属性内的反射?
- 23. 反射物体的属性
- 24. OSGI框架属性是否映射到系统属性
- 25. VB.NET自动实现的属性中缺少反思
- 26. 要实现属性与否?
- 27. 使用反射动态设置属性时出现问题
- 28. XML中的Spring的autowire属性是否覆盖了bean的@Autowired属性是如何自动装配的?
- 29. C#属性,是否有keypress属性?
- 30. 检查属性是否具有属性
非常感谢杰森,反射都跟我一样在此期间:)早该想到这一点。 – Zoki 2010-02-05 21:02:28
@ 3o4eTo:只是预先警告,这不是傻瓜证明,易碎,可能不能移动到单声道。 – jason 2010-02-05 21:07:34
在属性上没有getter时也要处理异常。 – nawfal 2013-05-12 11:22:30