反思GetMethod。选择一个更具体的方法

时间:2010-12-06 09:59:56

标签: c# reflection

我想获得方法,但有一个超载。例如在对象中,我试图获得“等于”。使用时

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

typeof(Object).GetMethod("Equals")给我一个例外,写typeof(Object).GetMethod("public virtual bool Equals(object obj)")让我无效。在这种情况下,如何指定我想要的方法?

3 个答案:

答案 0 :(得分:30)

使用one of the overloads可以指定参数类型。

例如:

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

或者:

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:0)

您可以尝试此代码..


public override void 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
}

}