2011-09-11 14 views
12

Tengo un MehtodBase de un método y necesito saber si ese método es una implementación de una interfaz específica. Así que si tengo la clase siguiente:Cómo encontrar si un método está implementando una interfaz específica

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

Implementación de la interfaz:

interface IMyInterface 
{ 
    void SomeMethod(); 
} 

Quiero ser capaz de descubrir en tiempo de ejecución (utilizando la reflexión) si un determinado método implementa IMyInterface.

+1

Qué quiere decir usted quiere determinar si 'MyClass.SomeMethod()' es una implementación explícita de 'IMyInterface.SomeMethod()'? –

+0

No necesariamente explícito pero no quiero saber si un objeto de base de método que obtuve es una implementación de un método de interfaz específico. –

Respuesta

12

Se puede utilizar para este GetInterfaceMap.

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

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

+1. realmente increíble, nunca escuché sobre esto. – Tigran

+0

Desafortunadamente no funciona para TypeBuilder. –

-5

si no tiene que usar el reflejo, entonces no. no es tan performante como, por ejemplo, utilizando el operador is o el operador as

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

if (someInstance is IMyInterface) dosomething(); 

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

Quiero saber que un método proporcionado por reflexión implementa una interfaz, no lo llame –

+0

si lo usa y devuelve verdadero, entonces usted sabe que implementa su interfaz. –

+0

Nuevamente: me interesa consultar la base de métodos para determinar que el método es una implementación del método en una interfaz, no la instancia. –

6

Puede utilizar Type.GetInterfaceMap() para ello:

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

Esto es bueno. Es de destacar que InterfaceMapping es una estructura, por lo que no la verifica como nula, sino que capta una ArgumentException. – user420667

Cuestiones relacionadas