【问题标题】:Find the original implementation of a virtual method查找虚方法的原始实现
【发布时间】:2009-05-29 16:27:24
【问题描述】:

我正在尝试使用反射来确定派生类从基类覆盖哪些方法。确定该方法是否没有被覆盖是相当容易的,但是尝试确定一个方法是否在基类中被覆盖,或者只是在派生类中创建为虚拟方法是我想要完成的.

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

  • 方法被覆盖:进程
  • 方法未被覆盖:导出

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

【问题讨论】:

    标签: c# .net reflection polymorphism


    【解决方案1】:

    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
    

    【讨论】:

    • 完美,正是我想要的。我不敢相信我错过了;)。
    【解决方案2】:

    我希望 BindingFlags.DeclaredOnly 与 Type.GetMethods() 一起使用会得到你想要的效果:

    http://msdn.microsoft.com/en-us/library/4d848zkb(loband).aspx

    【讨论】:

    • 这会得到在这个类中定义的方法,但是一旦我有了给定的 MethodInfo,我想看看它的基本定义是否在我的类中。
    猜你喜欢
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2020-09-10
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多