MVC получить все методы действий - PullRequest
3 голосов
/ 27 апреля 2011

Есть ли способ получить список всех методов действий моего проекта MVC 3?

Ответы [ 2 ]

8 голосов
/ 18 января 2013

Это даст вам словарь с типом контроллера в качестве ключа и IEnumerable его MethodInfos в качестве значения.

        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, ...)

7 голосов
/ 27 апреля 2011

Вы можете использовать это для отражения сборок во время выполнения для создания списка методов в контроллерах, которые возвращают 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)
                                        )
                    );
    }

Это даст вам действия, но не список представлений (т.е.это не сработает, если вы можете использовать разные представления в каждом действии)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...