可能重复:
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
是否为覆盖?
答案 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) )
{ ... }