Отражение 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
}
}