测试方法是否为覆盖?

时间:2010-06-16 18:03:57

标签: c# reflection oop system.reflection

  

可能重复:
  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是否为覆盖?

2 个答案:

答案 0 :(得分:12)

针对MethodInfo.GetBaseDefinition()进行测试。如果函数是覆盖,它将在基类中返回不同的方法。如果不是,则返回相同的方法对象。

  

在派生类中重写时,返回直接或间接基类上方法的MethodInfo对象,其中首次声明此实例表示的方法。

答案 1 :(得分:3)

您可以使用MethodInfo.DeclaringType来确定该方法是否为覆盖(假设它也是IsVirtual = true)。

来自文档:

  

...请注意,当B覆盖虚拟时   方法M来自A,它本质上是   重新定义(或重新声明)此方法。   因此,B.M的MethodInfo报告   声明类型为B而不是A,   即使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) )
    { ... }