Подтвердить что ты не робот

Как я могу получить список всех действий MVC-контроллера, передав ControllerName?

Как я могу получить список всех действий контроллера? Я ищу, но не могу найти пример/ответ. Я вижу пример, рекомендуемый с использованием отражения, но я не знаю, как это сделать.

Вот что я пытаюсь сделать:

public List<string> ActionNames(string controllerName){




}
4b9b3361

Ответ 1

Вы не сказали нам, зачем вам это нужно, но одна возможность - использовать рефлексию:

public List<string> ActionNames(string controllerName)
{
    var types =
        from a in AppDomain.CurrentDomain.GetAssemblies()
        from t in a.GetTypes()
        where typeof(IController).IsAssignableFrom(t) &&
                string.Equals(controllerName + "Controller", t.Name, StringComparison.OrdinalIgnoreCase)
        select t;

    var controllerType = types.FirstOrDefault();

    if (controllerType == null)
    {
        return Enumerable.Empty<string>().ToList();
    }
    return new ReflectedControllerDescriptor(controllerType)
        .GetCanonicalActions().Select(x => x.ActionName)
        .ToList();
}

Очевидно, что мы знаем, что отражение не очень быстро, поэтому, если вы намерены часто вызывать этот метод, вы можете подумать о его улучшении, кэшируя список контроллеров, чтобы избежать его получения каждый раз и даже memoizing метод для заданных входных параметров.

Ответ 2

Небольшая настройка Дарина. Мне понадобилось это изменение, чтобы заставить это работать с объективом кода, поскольку оно выполняется под другой сборкой.

public static List<string> GetAllActionNames(string controllerName)
{
    var controllerType = Assembly.Load("YourAssemblyNameHere")
        .GetTypes()
        .FirstOrDefault(x => typeof(IController).IsAssignableFrom(x) 
            && x.Name.Equals(controllerName + "Controller", StringComparison.OrdinalIgnoreCase));

    if (controllerType == null)
    {
        return Enumerable.Empty<string>().ToList();
    }
    return new ReflectedControllerDescriptor(controllerType)
        .GetCanonicalActions().Select(x => x.ActionName)
        .ToList();
}