获取具有相同名称的方法的集合

Man*_*eld 7 .net c# reflection

我有一些代码(用于帮助url路由)试图在控制器中找到一个动作方法.

我的控制器看起来像这样:

public ActionResult Item(int id)
{
    MyViewModel model = new MyViewModel(id);
    return View(model);
}

[HttpPost]
public ActionResult Item(MyViewModel model)
{
    //do other stuff here
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

以下代码尝试查找与url操作匹配的方法:

//cont is a System.Type object representing the controller
MethodInfo actionMethod = cont.GetMethod(action);
Run Code Online (Sandbox Code Playgroud)

今天这个代码抛出了一个System.Reflection.AmbiguousMatchException: Ambiguous match found有意义的,因为我的两个方法具有相同的名称.

我看了一下Type对象的可用方法,发现public MethodInfo[] GetMethods();它似乎做了我想要的,除了搜索具有特定名称的方法似乎没有重载.

我可以使用这个方法并搜索它返回的所有内容,但我想知道是否有另一种(更简单的)方法来获取具有特定名称的类中的所有方法的列表,当有多个时.

Ani*_*Ani 5

搜索 real 的结果并没有什么问题GetMethods,但如果你真的想这样做,你可以这样做:

var flags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;

var myOverloads = typeof(MyClass)
                  .GetMember("OverloadedMethodName", MemberTypes.Method, flags)
                  .Cast<MethodInfo>();
Run Code Online (Sandbox Code Playgroud)

...使用这种方法。您可能需要根据您的要求更改绑定标志。

我检查了参考源,发现这在内部依赖于由成员名称键控的缓存多重映射(请参阅 RuntimeType.GetMemberList),因此它应该比每次在客户端代码中搜索更有效。

你也可以这样做(至少在理论上更方便但效率稍低):

var myOverloads = typeof(MyClass).GetMember("OverloadedMethodName")
                                 .OfType<MethodInfo>();
Run Code Online (Sandbox Code Playgroud)