可能重複:
Determine if Equals() is an override?如何檢查方法在類型內是否被覆蓋?反射C#
我需要運行特定的代碼段用於特定類型是否覆蓋Object.Equals
與否。
如何檢查某個類型是否覆蓋此方法?
在VS中輸入typeof(mytype).GetMethod("Equals").
給我帶來了一個廣泛的選項列表,但沒有「IsOverriden」或類似的東西。
可能重複:
Determine if Equals() is an override?如何檢查方法在類型內是否被覆蓋?反射C#
我需要運行特定的代碼段用於特定類型是否覆蓋Object.Equals
與否。
如何檢查某個類型是否覆蓋此方法?
在VS中輸入typeof(mytype).GetMethod("Equals").
給我帶來了一個廣泛的選項列表,但沒有「IsOverriden」或類似的東西。
您可以使用綁定的標誌,你的優勢:
var t = typeof(mytype).GetMethod(
"Equals",
BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.DeclaredOnly
);
然後t
不null
當且僅當mytype
覆蓋Equals
。
你的代碼甚至不適用於'string'和大多數覆蓋equals的類型,因爲它碰到'AmbiguousMatchException',因爲這些類型重載'Equals'。它也沒有考慮隱藏的方法。檢查Ani對實際工作方法的重複答案。 – CodesInChaos 2011-12-27 17:30:09
檢查是否爲typeof(object)
。
是的,基本上檢查由GetMethod返回的MethodInfo對象的DeclaringType – 2011-12-27 16:38:21
這沒有幫助一點:對象默認情況下有Equals(),但它無法知道它是否被覆蓋。 – 2011-12-27 16:39:17
instance.GetType()。GetMethod('MethodName')。DeclaringType應該有所幫助,是的 – 2011-12-27 16:41:48
有兩種方法,首先MethodInfo
類有你可以用它來看看它是否是System.Object
。其次,您可以使用GetMethod
的超負荷接受BindingFlags
枚舉並傳入DeclaredOnly
以確保您不會獲得任何父對象。
多態性的要點是,您不必關心類是否覆蓋「Equals」這樣的方法 - 如果是,那麼您相信它做正確的事情。甚至在乎,聞起來。 – cHao 2011-12-27 16:36:40
你想知道*那個*類型是否覆蓋了該方法,或者它的任何基類是否覆蓋了該方法? – Gabe 2011-12-27 16:36:46
@cHao他可以製作一個框架,它使用需要實現自定義Equals的類型的反射。這在WPF中很常見。 – 2011-12-27 16:38:09