2010-12-06 12 views
16

Je veux obtenir la méthode mais il y a plus d'une surcharge. Par exemple, dans l'objet, j'ai essayé d'obtenir "Equals". Lorsque vous utilisezRéflexion GetMethod. sélectionnez une méthode plus spécifique

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

écrit typeof(Object).GetMethod("Equals") m'a fait une exception, écrit typeof(Object).GetMethod("public virtual bool Equals(object obj)") m'a fait nulle. Comment puis-je spécifier quelle méthode je veux dans ce cas?

Répondre

26

Utilisez one of the overloads pour spécifier les types de paramètres.

Par exemple:

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); 

Ou bien:

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

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

Ah ha! J'ai essayé la surcharge et seulement utilisé BindingFlags.Instance. Pas étonnant que j'ai obtenu null (et j'ai essayé BindingFlags.Public par lui-même ainsi sans réfléchir). Je veux vérifier si un objet remplace une méthode donc j'essaie de comparer ces méthodes et je me trompe. Y a-t-il un moyen pour moi de voir si "Equals" est identique à sa base ou a été remplacé? -edit- j'essaie d'écrire un pauvre mais convenable comparer par réflexion –

+0

@ acidzombie24: Je ne suis pas sûr, pour être honnête. Je pense que vous pourriez probablement obtenir la méthode déclarée dans cette classe, puis la méthode déclarée sur la classe de base, et voir si elles sont identiques ... mais je ne suis pas sûr. –

+0

Je ne parais pas capable de les comparer TOUJOURS je peux écrire .GetBaseDefinition() alors ce que j'ai fait s'appelait cela avec la méthode dans la base et cela devrait me dire si on était surchargé ou non –

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

Vous pouvez essayer ce code ..


override void publique OnResultExecuted (ResultExecutedContext filterContext) { var actionName = filterContext.RouteData .Values ​​["action"]. 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 
} 

}