2010-06-16 89 views
9

可能重複:
Detect if a method was overridden using Reflection (C#)測試一個方法是否是一個覆蓋?

有沒有辦法判斷一個方法是重寫?對於例如

public class Foo 
{ 
    public virtual void DoSomething() {} 
    public virtual int GimmeIntPleez() { return 0; } 
} 

public class BabyFoo: Foo 
{ 
    public override int GimmeIntPleez() { return -1; } 
} 

是否有可能反映BabyFoo並告訴我們,如果GimmeIntPleez是一個覆蓋?

+4

重複? - http://stackoverflow.com/questions/2932421/detect-if-a-method-was-overridden-using-reflection-c – 2010-06-16 18:07:06

+0

在運行時,還是編譯時間? – 2010-06-16 18:07:26

+0

非常好!非常感謝,Petar。你如何找到這樣的線程? – 2010-06-16 18:09:25

回答

3

您可以使用MethodInfo.DeclaringType來確定該方法是否爲覆蓋(假設它也是IsVirtual = true)。

從文檔:

...注意,當B從A覆蓋虛擬 子程序M,它基本上 重定義(或redeclares)此方法。 因此,BM的MethodInfo的報告

這裏聲明類型爲B,而不是A, 即使是其中這些方法 最初宣佈...是一個例子:

var someType = typeof(BabyFoo); 
var mi = someType.GetMethod("GimmeIntPleez"); 
// assuming we know GimmeIntPleez is in a base class, it must be overriden 
if(mi.IsVirtual && mi.DeclaringType == typeof(BabyFoo)) 
    { ... } 
+0

我的評論來得有點遲,但在這裏。我不認爲這個解決方案會這樣做,因爲BabyFoo類型可能用相同的名稱但不同的參數聲明自己的虛擬方法。該解決方案不會檢測到這一點。 – 2011-05-08 04:32:28

12

根據MethodInfo.GetBaseDefinition()進行測試。如果該函數是一個覆蓋,它將在基類中返回一個不同的方法。如果不是,則返回相同的方法對象。

在派生類中重寫時,返回該實例首次聲明的方法所針對的直接或間接基類中方法的MethodInfo對象。

+3

+1,因爲你是第一個提到GetBaseDefinition方法的人,我認爲這是找出方法是否是覆蓋的正確方法。 – 2011-05-08 04:34:42

相關問題