2010-09-06 3 views
4

Habituellement, j'accéder à une méthode de réflexion comme celui-ci:Comment puis-je accéder à une méthode implémentée explicitement en utilisant la réflexion?

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

Cependant, cela ne fonctionne pas lorsque M est une implémentation explicite:

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

Comment accéder une méthode explicitement mis en œuvre en utilisant la réflexion? C'est parce que le nom de la méthode n'est pas "M", ce sera "YourNamespace.SomeBase.M"

+0

Dans ce cas 'M 'est privé. Vous devriez utiliser l'enum 'BindingFlags'. – Steven

Répondre

8

Donc soit vous devrez spécifier ce nom (avec le BindingFlags approprié), soit obtenir la méthode du type d'interface à la place.

Ainsi, compte tenu de la structure suivante:

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

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

... vous pouvez effectuer ceci:

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

... ou ceci:

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