确定使用.NET中的反射实现/覆盖接口的方法

时间:2016-05-12 02:31:54

标签: c# .net reflection

如果Type实现(或继承实现)接口和该接口的MethodInfo方法,我如何使用反射来确定将调用哪个方法?

考虑以下课程:

using System;

public class A : IDisposable {
    public virtual void Dispose() { Console.WriteLine("A.Dispose"); }
}

public class B : A {
    public new virtual void Dispose() { Console.WriteLine("B.Dispose"); }
}

public class C : A, IDisposable {
    public new virtual void Dispose() { Console.WriteLine("C.Dispose"); }
}

public class D : A, IDisposable {
    void IDisposable.Dispose() { Console.WriteLine("D.IDisposable.Dispose"); }
}

public class Program
{
    public static void Main()
    {
        ((IDisposable)new A()).Dispose(); // A.Dispose
        ((IDisposable)new B()).Dispose(); // A.Dispose
        ((IDisposable)new C()).Dispose(); // C.Dispose
        ((IDisposable)new D()).Dispose(); // D.IDisposable.Dispose
    }
}

我想我可以对最衍生的方法进行蛮力搜索

  • 具有相同的签名
  • 并使用接口方法的名称或限定名称
  • 并忽略继承(而不是实现)接口的类中的newslot方法
  • 并忽略忽略方法的任何覆盖
  • 和......

它将成为一个复杂的角落案例列表,很难做到正确,更不用说它会错过使用TypeBuilder.DefineMethodOverride创建的无关名称的覆盖。

有更好的方法吗?

0 个答案:

没有答案