所以在我的情況下,我正在使用反射來發現類的結構。我需要能夠通過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