2010-09-06 77 views
4

通常情况下,我在反思访问的方法是这样的:如何使用反射访问显式实现的方法?

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

然而,当M是一个明确的执行失败:

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

如何访问使用反射的明确实现的方法?

+0

在这种情况下,'M '是私人的。你应该使用'BindingFlags'枚举。 – Steven 2010-09-06 10:08:38

回答

8

这是因为方法的名称不是"M",它将是"YourNamespace.SomeBase.M"。因此,您需要指定该名称(以及适当的BindingFlags),或者从接口类型中获取方法。

因此,考虑以下结构:

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

    class Foo : IFoo 
    { 
     void IFoo.M() 
     { 
      Console.WriteLine("M"); 
     } 
    } 
} 

...您可以执行此:

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

...或这个:

Foo obj = new Foo(); 
typeof(IFoo) 
    .GetMethod("M") 
    .Invoke(obj, null);