2009-07-11 9 views
23

I tienen una MethodInfo de un método interfaz y Type de una claseque implementa la interfaz. Quiero encontrar el MethodInfo del método de clase que implementa el método de interfaz.¿Cómo obtener MethodInfo del método de interfaz, teniendo implementación MethodInfo of class method?

El simple method.GetBaseDefinition() no funciona con los métodos de interfaz. La búsqueda por nombre tampoco funcionará, porque al implementar el método de interfaz explícitamente puede tener cualquier nombre (sí, no en C#).

¿Cuál es la forma correcta de hacerlo que cubre todas las posibilidades?

Respuesta

33

OK, encontré una forma, usando GetInterfaceMap.

var map = targetType.GetInterfaceMap(interfaceMethod.DeclaringType); 
var index = Array.IndexOf(map.InterfaceMethods, interfaceMethod); 

if (index == -1) 
{ 
    //this should be literally impossible 
} 

return map.TargetMethods[index]; 
1

Hmmm - no estoy seguro acerca de la forma correcta, pero puede hacerlo al recorrer todas las interfaces de su tipo, y luego buscar en las interfaces el método. No estoy seguro si puede hacerlo directamente sin el bucle a través de las interfaces, ya que está un poco atrapado sin GetBaseDefinition().

Para mi interfaz con un solo método (MiMetodo) y mi tipo (MyClass) que implementa este método puedo usar esto:

MethodInfo interfaceMethodInfo = typeof(IMyInterface).GetMethod("MyMethod"); 
MethodInfo classMethodInfo = null; 
Type[] interfaces = typeof(MyClass).GetInterfaces(); 

foreach (Type iface in interfaces) 
{ 
    MethodInfo[] methods = iface.GetMethods(); 

    foreach (MethodInfo method in methods) 
    { 
     if (method.Equals(interfaceMethodInfo)) 
     { 
      classMethodInfo = method; 
      break; 
     } 
    } 
} 

que tendría que comprobar que los MethodInfo.Equals funciona si el dos métodos tienen diferentes nombres. Ni siquiera sabía que eso era posible, probablemente porque era un C# 'er

+0

No puede coincidir con el nombre. Los nombres no tienen que coincidir. Es una regla de C#, otros idiomas (VB) le permiten nombrar métodos de anulación como prefiera. –

+0

Mi ejemplo anterior no coincide con el nombre, está haciendo coincidir el método Equals en MethodInfo. Solo quería decir que necesitaría volver a verificar que MethodInfo.Equals aún considere dos instancias iguales si varían solo por su nombre. –

+0

Bien, lo siento, pero su código todavía no está haciendo lo que necesito. No me dará información sobre el método de la clase, me dará información sobre el método de la interfaz. Simplemente afirmas que la clase implementa la interfaz. –

Cuestiones relacionadas