10

可能重复:
检测是否使用反射 (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

2 回答 2

13

针对MethodInfo.GetBaseDefinition(). 如果该函数是一个覆盖,它将返回基类中的不同方法。如果不是,将返回相同的方法对象。

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

于 2010-06-16T18:11:52.047 回答
4

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

从文档中:

...请注意,当 B 从 A 覆盖虚拟方法 M 时,它实质上是重新定义(或重新声明)此方法。因此,BM 的 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) )
    { ... }
于 2010-06-16T18:08:09.807 回答