Wat*_* v2 10 c# oop reflection system.reflection
有没有办法判断一个方法是否是一个覆盖?例如
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对象,其中首次声明此实例表示的方法.
您可以使用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)