找到虚拟方法的原始实现

时间:2009-05-29 16:27:24

标签: c# .net reflection polymorphism

我正在尝试使用反射来确定派生类覆盖基类的哪些方法。可以很容易地确定方法是否被覆盖,但是尝试确定方法是否在基类中被覆盖,或者只是在派生类中创建为虚拟是我正在尝试完成的

因此,如果A类具有虚拟方法Process和Export,而B类具有虚拟方法Process(重写)和Display(新虚拟方法),那么在检查B类时我希望得到以下结果;

  • 方法被覆盖:过程
  • 未覆盖的方法:导出

我只想在检查派生自B类的类时处理Display方法。

2 个答案:

答案 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