2010-11-12 12 views
9

Necesito verificar la igualdad entre dos MethodInfos. En realidad, son exactamente las mismas MethodInfo a excepción del ReflectedType (es decir, el DeclaringType es el mismo y los métodos deberían tener el mismo cuerpo). Hay varias maneras de hacerlo, pero estoy buscando la más eficiente.MethodInfo Igualdad para declarar el tipo

Ahora mismo tengo:

public static bool AreMethodsEqualForDeclaringType(this MethodInfo first, MethodInfo second) 
    { 
     first = first.ReflectedType == first.DeclaringType ? first : first.DeclaringType.GetMethod(first.Name, first.GetParameters().Select(p => p.ParameterType).ToArray()); 
     second = second.ReflectedType == second.DeclaringType ? second : second.DeclaringType.GetMethod(second.Name, second.GetParameters().Select(p => p.ParameterType).ToArray()); 
     return first == second; 
    } 

Esto es un poco caro, así que me estoy preguntando si hay una manera mejor ...

¿Debería la comparación de los dos cuerpos de los métodos en su lugar? p.ej.

first.GetMethodBody() == second.GetMethodBody() 

Thanks.

+0

por qué no puedes simplemente comparar los tipos declaración directa sin comparar dobladillo a los tipos reflejados? También me interesa saber por qué lo necesitas así que esto. – jgauffin

+1

Definitivamente podría simplemente comparar los tipos que declaran, pero es más costoso porque eso requiere llamar a GetParameters(), mientras que, si los ReflectedTypes son iguales, puedo hacer una comprobación de igualdad regular. – Jeff

+1

Necesito hacer esto porque tengo clases Proxy creadas por EntityFramework en el tiempo de ejecución que estoy haciendo una reflexión sobre. – Jeff

Respuesta

3

que supongo que voy a dejar mi respuesta como la respuesta a la pregunta ...

Una cosa a tener en cuenta:

first.GetMethodBody() == second.GetMethodBody() 

NO funciona ... lo que la única respuesta que he encontrado hasta la fecha es:

public static bool AreMethodsEqualForDeclaringType(this MethodInfo first, MethodInfo second) 
{ 
    first = first.ReflectedType == first.DeclaringType ? first : first.DeclaringType.GetMethod(first.Name, first.GetParameters().Select(p => p.ParameterType).ToArray()); 
    second = second.ReflectedType == second.DeclaringType ? second : second.DeclaringType.GetMethod(second.Name, second.GetParameters().Select(p => p.ParameterType).ToArray()); 
    return first == second; 
} 
+0

el cuerpo del método tiene un byte [] que es el IL del cuerpo del método, puede comparar esos byte por byte en lugar de usar simplemente "==". –

+0

@Jeff. Sé que llevo más o menos una década de la fiesta, pero ... ¿sigues usando este código con éxito? Necesito algo similar, pero no buscando inventar una rueda. [Ayende tiene una publicación sobre esto] (http://ayende.com/blog/2658/method-equality) que seguramente debiste haber visto. Apreciar cualquier comentario. Cheers – Berryl

1

¿Podría comparar la ayuda MetadataToken y Module?

La documentación de MetadataToken lo describe como: "Un valor que, en combinación con el Módulo, identifica de manera única un elemento de metadatos".

Hasta ahora, he encontrado que funciona para comparar instancias de MemberInfo iguales, excepto para ReflectedType. Pero no lo probé para casos como las definiciones de métodos genéricos.

+0

Gracias, pero ese es específicamente el caso donde no funciona. – Jeff

0

Este código funciona cuando intenta método de clase e interfaz iguales:

static bool EquelMethods(MethodInfo method1, MethodInfo method2) 
    { 
     var find = method1.DeclaringType.GetMethod(method2.Name, method2.GetParameters().Select(p => p.ParameterType).ToArray()); 
     return find != null; 
    } 
Cuestiones relacionadas