繁体   English   中英

MVC 获取所有动作方法

[英]MVC get all action methods

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

这将为您提供一个字典,其中 controller 类型作为键,其 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,...)

您可以使用它在运行时反映程序集,以在控制器中生成返回 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)
                                        )
                    );
    }

这将为您提供操作,但不是视图列表(即,如果您可以在每个操作中使用不同的视图,它将不起作用)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM