2010-06-16 65 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

相关问题