c# - sobreescrito - ¿Cómo obtener MethodInfo del método de interfaz, teniendo implementado MethodInfo of class method?
public void override c# (2)
Tengo un MethodInfo
de un método de interfaz y el Type
de una clase que implementa la interfaz . Quiero encontrar MethodInfo
del método de clase que implementa el método de interfaz.
El method.GetBaseDefinition()
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 #).
Entonces, ¿cuál es la forma correcta de hacerlo que cubre todas las posibilidades?
Hmmm: no estoy seguro de la forma correcta , pero puede hacerlo pasando por todas las interfaces de su tipo y luego buscando 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 (MyMethod) 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;
}
}
}
Debería comprobar que MethodInfo.Equals funciona si los dos métodos tienen diferentes nombres. Ni siquiera sabía que eso fuera posible, probablemente porque soy un C # er
OK, encontré una forma, usando GetInterfaceMap .
var map = targetType.GetInterfaceMap(interfaceMethod.DeclaringType);
var index = Array.IndexOf(map.InterfaceMethods, interfaceMethod);
if (index == -1)
{
//this should literally be impossible
}
return map.TargetMethods[index];