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

时间:2013-05-29 13:30:19

标签: c# .net 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);
}

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

//cont is a System.Type object representing the controller
MethodInfo actionMethod = cont.GetMethod(action);

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

我查看了Type对象的可用方法,发现public MethodInfo[] GetMethods();似乎做了我想做的事情,除了搜索方法似乎没有重载一个特定的名字。

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

3 个答案:

答案 0 :(得分:4)

真正搜索GetMethods的结果并没有错,但如果你真的想要,你可以这样做:

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

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

...使用this method。您可能需要根据您的要求更改绑定标志。

我检查了reference-source,发现这内部依赖于由member-name键入的缓存多重映射(请参阅RuntimeType.GetMemberList),因此 比在客户端代码中搜索更有效每一次。

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

var myOverloads = typeof(MyClass).GetMember("OverloadedMethodName")
                                 .OfType<MethodInfo>();

答案 1 :(得分:2)

使用GetMethods()获取方法集合并使用Lambda表达式对其进行过滤:GetMethods().Where(p => p.Name == "XYZ").ToList();

答案 2 :(得分:1)

使用

cont.GetMethod(action, new [] {typeof(MyViewModel )})