Nie powiedziano nam, dlaczego trzeba to tylko jedną z możliwości jest użycie refleksji:
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();
}
Oczywiście, jak wiemy odbicie nie jest zbyt szybki, więc jeśli zamierzasz wywoływać tę metodę często, możesz rozważyć ulepszenie jej poprzez buforowanie listy kontrolerów, aby uniknąć pobierania za każdym razem, a nawet memoizing metody dla danych parametrów wejściowych.
Zamierzam tu dodać komentarz, ponieważ jest ogólny. Bo to, co próbujesz zrobić (nazwy akcji kontrolera) nie jest sposobem, w jaki należy to zrobić. Może być kilka akcji o tej samej nazwie, niektóre mogą być tylko Ajaxem itd. Itd. Twoje uprawnienia powinny być oparte na innych rzeczach niż działania kontrolera. –