我正在尝试使用反射来确定派生类覆盖基类的哪些方法。可以很容易地确定方法是否不被覆盖,但是尝试确定方法是否在基类中被覆盖,或者只是在派生类中创建为虚拟是我正在尝试完成的
因此,如果A类具有虚拟方法Process和Export,而B类具有虚拟方法Process(重写)和Display(新虚拟方法),那么在检查B类时我希望得到以下结果;
我只想在检查派生自B类的类时处理Display方法。
答案 0 :(得分:6)
GetBaseDefinition
你追求的是什么?
基本上
if (method.GetBaseDefinition() == method)
{
// Method was declared in this class
}
以下示例显示了您感兴趣的案例:
using System;
using System.Reflection;
class Base
{
public virtual void Overridden() {}
public virtual void NotOverridden() {}
}
class Derived : Base
{
public override void Overridden() {}
public virtual void NewlyDeclared() {}
}
public class Test
{
static void Main()
{
foreach (MethodInfo method in typeof(Derived).GetMethods())
{
Console.WriteLine("{0}: {1} {2} {3}",
method.Name,
method == method.GetBaseDefinition(),
method.DeclaringType,
method.GetBaseDefinition().DeclaringType);
}
}
}
输出:
Overridden: False Derived Base
NewlyDeclared: True Derived Derived
NotOverridden: False Base Base
ToString: False System.Object System.Object
Equals: False System.Object System.Object
GetHashCode: False System.Object System.Object
GetType: True System.Object System.Object
答案 1 :(得分:0)
我希望BindingFlags.DeclaredOnly与Type.GetMethods()一起使用可以获得你想要的效果:
http://msdn.microsoft.com/en-us/library/4d848zkb(loband).aspx