2011-12-27 74 views
1

可能重複:
Determine if Equals() is an override?如何檢查方法在類型內是否被覆蓋?反射C#

我需要運行特定的代碼段用於特定類型是否覆蓋Object.Equals與否。

如何檢查某個類型是否覆蓋此方法?

在VS中輸入typeof(mytype).GetMethod("Equals").給我帶來了一個廣泛的選項列表,但沒有「IsOverriden」或類似的東西。

+1

多態性的要點是,您不必關心類是否覆蓋「Equals」這樣的方法 - 如果是,那麼您相信它做正確的事情。甚至在乎,聞起來。 – cHao 2011-12-27 16:36:40

+0

你想知道*那個*類型是否覆蓋了該方法,或者它的任何基類是否覆蓋了該方法? – Gabe 2011-12-27 16:36:46

+0

@cHao他可以製作一個框架,它使用需要實現自定義Equals的類型的反射。這在WPF中很常見。 – 2011-12-27 16:38:09

回答

0

您可以使用綁定的標誌,你的優勢:

var t = typeof(mytype).GetMethod(
      "Equals", 
      BindingFlags.Public | 
      BindingFlags.Instance | 
      BindingFlags.DeclaredOnly 
     ); 

然後tnull當且僅當mytype覆蓋Equals

+3

你的代碼甚至不適用於'string'和大多數覆蓋equals的類型,因爲它碰到'AmbiguousMatchException',因爲這些類型重載'Equals'。它也沒有考慮隱藏的方法。檢查Ani對實際工作方法的重複答案。 – CodesInChaos 2011-12-27 17:30:09

1

檢查​​是否爲typeof(object)

+0

是的,基本上檢查由GetMethod返回的MethodInfo對象的DeclaringType – 2011-12-27 16:38:21

+0

這沒有幫助一點:對象默認情況下有Equals(),但它無法知道它是否被覆蓋。 – 2011-12-27 16:39:17

+0

instance.GetType()。GetMethod('MethodName')。DeclaringType應該有所幫助,是的 – 2011-12-27 16:41:48

1

有兩種方法,首先MethodInfo類有​​你可以用它來看看它是否是System.Object。其次,您可以使用GetMethod的超負荷接受BindingFlags枚舉並傳入DeclaredOnly以確保您不會獲得任何父對象。

相關問題