2011-04-27 38 views
3

有没有办法让我的MVC 3项目的所有操作方法列表?MVC获取所有操作方法

+0

在运行时还是在VS? – Richard 2011-04-27 09:08:22

+0

你是指动作还是视图?如果您的意思是视图,您是否包含部分视图?还有哪个viewengine?如果您使用默认值,那么您可以使用反射来获取从System.Web.Mvc.ViewPage或ViewPage 继承的程序集/命名空间中的每个类的列表。您可以执行相同类型的操作 - 使用反射来标识从Controller继承的所有类以及返回ActionResult派生的所有公共方法。 – RichardW1001 2011-04-27 09:20:06

+0

我想在VS的行动 – 2011-04-27 09:44:28

回答

7

您可以在运行时使用,以反映对组件的生产方法列表中返回的ActionResult控制器:

public IEnumerable<MethodInfo> GetMvcActionMethods() 
    { 
     return 
      Directory.GetFiles(Assembly.GetExecutingAssembly().Location) 
       .Select(Assembly.LoadFile) 
       .SelectMany(
        assembly => 
        assembly.GetTypes() 
          .Where(t => typeof (Controller).IsAssignableFrom(t)) 
          .SelectMany(type => (from action in type.GetMethods(BindingFlags.Public | BindingFlags.Instance) 
               where action.ReturnType == typeof(ActionResult) 
               select action) 
             ) 
        ); 
    } 

这会给你的行动,而不是浏览列表(即它如果您可以在每个操作中使用不同的视图,则不起作用)

+1

此方法将不包括返回“FileContentResult”,“JsonResult”,... 的行动方法请参阅我的回应低于 – Moeri 2013-06-11 13:04:56

8

这将为您提供一个字典,其中控件类型为键,其MethodInfos的IEnumerable为值。

 var assemblies = AppDomain.CurrentDomain.GetAssemblies(); // currently loaded assemblies 
     var controllerTypes = assemblies 
      .SelectMany(a => a.GetTypes()) 
      .Where(t => t != null 
       && t.IsPublic // public controllers only 
       && t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase) // enfore naming convention 
       && !t.IsAbstract // no abstract controllers 
       && typeof(IController).IsAssignableFrom(t)); // should implement IController (happens automatically when you extend Controller) 
     var controllerMethods = controllerTypes.ToDictionary(
      controllerType => controllerType, 
      controllerType => controllerType.GetMethods(BindingFlags.Public | BindingFlags.Instance).Where(m => typeof(ActionResult).IsAssignableFrom(m.ReturnType))); 

它看起来不仅仅是当前程序集,它还会返回方法,例如返回JsonResult而不是ActionResult。 (JsonResult实际上是从继承的ActionResult)

编辑:对于Web API支持

变化

&& typeof(IController).IsAssignableFrom(t)); // should implement IController (happens automatically when you extend Controller) 

&& typeof(IHttpController).IsAssignableFrom(t)); // should implement IHttpController (happens automatically when you extend ApiController) 

,并删除此:

.Where(m => typeof(ActionResult).IsAssignableFrom(m.ReturnType)) 

要导致Web API方法可以返回任何东西。 (POCO的,HttpResponseMessage,...)

+0

+1的方法,返回更多详细信息(我喜欢它如何将'行动'与他们各自的'控制器') – JakeJ 2013-10-07 22:42:10

+0

在webapi的情况下,此代码获取许多冗余方法 - 构造函数,所有公共属性(从ApiController继承)等。更精确的方法在这里描述:http://stackoverflow.com/questions/28069206/how-can- I-得到最列表中,所有的行动 - 的 - apicontroller – LbISS 2015-12-28 19:16:28