2010-12-06 8 views
16

quiero obtener el método, pero hay más de una sobrecarga. Por ejemplo, en el objeto intenté obtener 'Igual'. Al utilizarReflection GetMethod. seleccione un método más específico

public virtual bool Equals(object obj); 
    public static bool Equals(object objA, object objB); 

escribir typeof(Object).GetMethod("Equals") me consiguió una excepción, escribiendo typeof(Object).GetMethod("public virtual bool Equals(object obj)") me hizo nulo. ¿Cómo especifico qué método quiero en este caso?

Respuesta

26

Uso one of the overloads que le permite especificar los tipos de parámetros.

Por ejemplo:

var staticMethod = typeof(Object).GetMethod("Equals", 
     BindingFlags.Static | BindingFlags.Public, 
     null, 
     new Type[] { typeof(object), typeof(object) }, 
     null); 

var instanceMethod = typeof(Object).GetMethod("Equals", 
     BindingFlags.Instance | BindingFlags.Public, 
     null, 
     new Type[] { typeof(object) }, 
     null); 

O, alternativamente:

var staticMethod = typeof(Object).GetMethod("Equals", 
     new Type[] { typeof(object), typeof(object) }); 

var instanceMethod = typeof(Object).GetMethod("Equals", 
     new Type[] { typeof(object) }); 
+0

Ah, ja! Probé la sobrecarga y solo utilicé BindingFlags.Instance. No es de extrañar por qué obtuve nulo (y probé BindingFlags.Public por sí mismo también sin pensar). Quiero comprobar si un objeto anula un método, así que estoy tratando de comparar estos métodos y me sale falso. ¿Hay alguna manera de ver si "Igual" es igual a su base o ha sido anulado? -edito- estoy tratando de escribir una comparación pobre pero adecuada por reflexión –

+0

@ acidzombie24: No estoy seguro, para ser sincero. Creo que probablemente puedas declarar el método en esta clase, y luego declarar el método en la clase base, y ver si son los mismos ... pero no estoy seguro. –

+0

No parezco capaz de compararlos SIN EMBARGO puedo escribir .GetBaseDefinition() entonces lo que hice fue llamar esto con el método en la base y eso debería decirme si uno fue anulado o no –

5
MethodInfo methodInfo = typeof(object).GetMethod("Equals", new Type[] { typeof(object), typeof(object) }); 
0

Puede probar este código ..


override public void OnResultExecuted (ResultExecutedContext filterContext) {var actionName = filterContext.RouteData .Values ​​["acción"]. ToString();

var ctlr = filterContext.Controller as Controller; 
if (ctlr == null) return; 
var invoker = ctlr.ActionInvoker as ControllerActionInvoker; 
if (invoker == null) return; 

var invokerType = invoker.GetType(); 
var getCtlrDescMethod = invokerType.GetMethod("GetControllerDescriptor", BindingFlags.NonPublic | BindingFlags.Instance); 
var ctlrDesc = getCtlrDescMethod.Invoke(invoker, new object[] {ctlr.ControllerContext}) as ControllerDescriptor; 

var findActionMethod = invokerType.GetMethod("FindAction", BindingFlags.NonPublic | BindingFlags.Instance); 
var actionDesc = findActionMethod.Invoke(invoker, new object[] { ctlr.ControllerContext, ctlrDesc, actionName }) as ReflectedActionDescriptor; 
if (actionDesc == null) return; 

if (actionDesc.MethodInfo.ReturnType == typeof (ActionResult)) 
{ 
    // you're in 
} 

}

Cuestiones relacionadas