2011-09-11 11 views
12

Ho un MehtodBase di un metodo e ho bisogno di sapere se quel metodo è un'implementazione di un'interfaccia specifica. Quindi, se ho la seguente classe:Come scoprire se un metodo sta implementando un'interfaccia specifica

class MyClass : IMyInterface 
{ 
    public void SomeMethod(); 
} 

implementazione dell'interfaccia:

interface IMyInterface 
{ 
    void SomeMethod(); 
} 

voglio essere in grado di scoprire in fase di esecuzione (utilizzando la riflessione) se un certo metodo implementa IMyInterface.

+1

Vuoi dire che si desidera determinare se 'MyClass.SomeMethod()' è un'implementazione esplicita di 'IMyInterface.SomeMethod()'? –

+0

Non necessariamente esplicito, ma voglio sapere se un oggetto methodbase che ho ottenuto è un'implementazione di uno specifico metodo di interfaccia. –

risposta

12

È possibile utilizzare GetInterfaceMap per questo.

InterfaceMapping map = typeof(MyClass).GetInterfaceMap(typeof(IMyInterface)); 

foreach (var method in map.TargetMethods) 
{ 
    Console.WriteLine(method.Name + " implements IMyInterface"); 
} 
+1

+1. davvero fantastico, mai ascoltato su questo. – Tigran

+0

Purtroppo non funziona con TypeBuilder. –

-5

se non è necessario utilizzare la riflessione, quindi non. non è così performante come, ad esempio, utilizzando il l'operatore is o as operatore

class MyClass : IMyInterface 
{ 
    public void SomeMethod(); 
} 

if (someInstance is IMyInterface) dosomething(); 

var foo = someInstance as IMyInterface; 
if (foo != null) foo.SomeMethod(); 
+0

Voglio sapere che un metodo fornito da reflection implementa un'interfaccia - non chiamarlo –

+0

se lo si usa e se restituisce true, allora sai che implementa la tua interfaccia. –

+0

Ancora una volta - Mi interessa interrogare methodbase per determinare che il metodo è un'implementazione del metodo in un'interfaccia, non l'istanza. –

6

È possibile utilizzare Type.GetInterfaceMap() per questo:

bool Implements(MethodInfo method, Type iface) 
{ 
    return method.ReflectedType.GetInterfaceMap(iface).TargetMethods.Contains(method); 
} 
+0

Questo è buono. Da notare che InterfaceMapping è una struct, quindi non lo si controlla per null, ma si cattura una ArgumentException. – user420667

Problemi correlati