2010-06-23 59 views
4

MSDN文檔:MemberInfo.GetCustomAttibutes Method (Type, Boolean)國的言論:ICustomAttributeProvider.GetCustomAttributes(...):設計奇怪?

這種方法會忽略屬性和事件的繼承參數。要在繼承鏈中搜索屬性和事件的屬性,請使用Attribute.GetCustomAttributes方法的適當重載。

這基本上意味着,這個實現的第二個參數(bool inherit)爲事件會員財產成員忽略。但是,調用Attribute.GetCustomAttributes(MemberInfo,Type,bool)多種此操作不會。

讓我困惑的是這個設計。

他們爲什麼看起來會忽略2種成員類型的任意繼承屬性?

如果有人可以對此有所瞭解,我會非常感激。

回答

1

這絕對是令人困惑的。嚴格的答案是屬性和事件不會被繼承,所以inherited參數沒有意義。參考文獻ECMA 335 CLI Specification第8.10.3節。

從根本上說,屬性和事件 是適合使用的靶向 CLI和不被VES本身直接支持 工具的元數據 的結構。因此, 源語言的作業 編譯器和反射庫 (請參閱分區IV)確定規則 作爲名稱隱藏,繼承,等等 。源編譯器應生成直接訪問由事件命名的方法和 屬性的CIL,而不是事件或 屬性本身。

該規範沒有提到編譯器應該如何實現這一點。在C#中,屬性是通過單獨的getter和setter方法實現的,這些方法可以聲明爲virtualoverride。同樣,對於事件,還有單獨的addhandler和removehandler方法。

所以簡單的答案是,屬性和事件是嚴格的元數據,沒有任何實現根據規範。這就是爲什麼它們不能像方法那樣被繼承。

+0

哇!很好的答案。 +1和已接受,謝謝。它現在非常有意義! – Aren 2010-06-23 18:40:15

+0

我不得不承認我認爲這也很奇怪。我很驚訝這個問題沒有得到更多的選票。 – 2010-06-23 19:25:34