2017-07-07 26 views
2

我注意到有兩種方法(一類方法和一種擴展方法)具有相同簽名但不同的返回類型在包的System.Reflection類的MemberInfo:MemberInfo.GetCustomAttributes擴展超載

類方法:

public abstract object[] GetCustomAttributes(Type attributeType, bool inherit) 

擴展方法(內側CustomAttributeExtensions):

public static IEnumerable<Attribute> GetCustomAttributes(this MemberInfo element, Type attributeType, bool inherit) 

我知道用這樣的參數調用該方法總是會調用類方法,所以我只是想知道:

如何調用擴展方法?

,首先,什麼是定義具有相同簽名類方法的擴展的目的是什麼?

+3

你可以稱之爲靜態方法。 'CustomAttributeExtensions.GetCustomAttributes(element,attribute,inherit);' – NtFreX

+0

如果你給我們更多的上下文會有幫助 - 這個CustomAttributeExtensions類在哪裏? –

+0

這是參考https://msdn.microsoft.com/zh-cn/library/hh138301(v=vs.110).aspx – Andrea

回答

6

有了這種在一個框架重複的是不完全的特點。但是這是一個困難的地方,他們不得不在.NET 4.5中添加擴展方法。從版本信息塊中MSDN文章的底部可以很容易地看到它們。擴展方法可用於UWP和電話項目,而傳統方法則不適用。

基本原因是在4.5中內置到CLR中的語言投影。它使得WinRT和CLR類型之間的相當大的差異非常隱蔽。如果程序員有任何暗示它實際上是UWP下的COM的話,那麼WinRT將會一直存在,比以前更多了:)隱藏得很好,但Type類與CLR結婚太重了,他們不得不提供TypeInfo類作爲替代。和擴展方法來彌合api差距。

如果你沒有目標UWP那麼你不必爲擴展方法多大用處,應該有利於傳統方法。擴展方法is about 30% slower

2

你說得對,有MemberInfo.GetCustomAttributesCustomAttributeExtensions.GetCustomAttributes與有效的同一組參數。

如果你看一下每個參考源,你可以看到擴展方法實際上代表回Attribute.GetCustomAttribute。那種方法最終會回到MemberInfo.GetCustomAttributes

那麼,有沒有這兩個之間的功能區別?不,不是。那麼這種擴展方法存在的原因是什麼?我不幸沒有任何線索。 CustomAttributeExtensions的主要好處是無論如何都允許你重新獲得輸入屬性的泛型重載,所以我不認爲你真的想在通常情況下使用GetCustomAttributes