8

我有一些代码(用于帮助 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();似乎可以满足我的要求,但搜索具有特定名称的方法似乎没有重载。

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

4

3 回答 3

4

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

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

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

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

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

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

var myOverloads = typeof(MyClass).GetMember("OverloadedMethodName")
                                 .OfType<MethodInfo>();
于 2013-05-29T13:38:42.770 回答
2

GetMethods()只需使用 Lambda 表达式通过 amd 过滤它们来获取方法集合:GetMethods().Where(p => p.Name == "XYZ").ToList();

于 2013-05-29T13:33:43.293 回答
1

采用

cont.GetMethod(action, new [] {typeof(MyViewModel )})
于 2013-05-29T13:32:57.093 回答