如何使用反射访问显式实现的方法?

maf*_*afu 6 .net c# reflection explicit-implementation

通常,我在这样的反射中访问一个方法:

class Foo
{
    public void M () {
        var m = this.GetType ().GetMethod ("M");
        m.Invoke(this, new object[] {}); // notice the pun
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当M是显式实现时,这会失败:

class Foo : SomeBase
{
    void SomeBase.M () {
        var m = this.GetType ().GetMethod ("M");
        m.Invoke(this, new object[] {}); // fails as m is null
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用反射访问显式实现的方法?

Fre*_*örk 10

这是因为方法的名称不是"M",它将是"YourNamespace.SomeBase.M".因此,无论你需要指定名称(用适当情况下BindingFlags),或者从接口类型,而不是方法.

因此给出以下结构:

namespace SampleApp
{    
    interface IFoo
    {
        void M();
    }

    class Foo : IFoo
    {
        void IFoo.M()
        {
            Console.WriteLine("M");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

......你可以这样做:

Foo obj = new Foo();
obj.GetType()
    .GetMethod("SampleApp.IFoo.M", BindingFlags.Instance | BindingFlags.NonPublic)
    .Invoke(obj, null);            
Run Code Online (Sandbox Code Playgroud)

...或这个:

Foo obj = new Foo();
typeof(IFoo)
    .GetMethod("M")
    .Invoke(obj, null);  
Run Code Online (Sandbox Code Playgroud)