Отражение GetMethod.выберите более конкретный метод - PullRequest
18 голосов
/ 06 декабря 2010

Я хочу получить метод, но есть более одной перегрузки.Например, в объекте я пытался получить «Равные».При использовании

    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 ]

30 голосов
/ 06 декабря 2010

Используйте одну из перегрузок , которая позволяет указывать типы параметров.

Например:

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) });
6 голосов
/ 06 декабря 2010
MethodInfo methodInfo = typeof(object).GetMethod("Equals", new Type[] { typeof(object), typeof(object) });
0 голосов
/ 30 июля 2013

Вы можете попробовать этот код ..


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
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...