Отражение GetMethod. выберите более конкретный метод

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

    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)") получил меня null. Как указать, какой метод я хочу в этом случае?

Ответы

Ответ 1

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

Например:

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

Ответ 2

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

Ответ 3

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


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
}

}