2011-04-27 59 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

相關問題