我有一些代码(用于帮助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();
似乎做了我想做的事情,除了搜索方法似乎没有重载一个特定的名字。
我可以使用这个方法并搜索它返回的所有内容,但我想知道是否有另一种(更简单的)方法来获取具有特定名称的类中所有方法的列表,当有多个时。
答案 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 )})