测试方法是否为覆盖?

Wat*_* v2 10 c# oop reflection system.reflection

可能重复:
检测是否使用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; }
}
Run Code Online (Sandbox Code Playgroud)

是否可以反思BabyFoo并判断是否GimmeIntPleez是覆盖?

zil*_*n01 13

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

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

  • +1因为你是第一个提到GetBaseDefinition方法的人,我认为这是判断方法是否为覆盖的正确方法. (3认同)

LBu*_*kin 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) )
    { ... }
Run Code Online (Sandbox Code Playgroud)