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