如何获取 Controller 的所有操作的列表?我搜索但找不到示例/答案。我看到一些建议使用反射的示例,但我不知道如何。
这是我正在尝试做的事情:
public List<string> ActionNames(string controllerName){
}
如何获取 Controller 的所有操作的列表?我搜索但找不到示例/答案。我看到一些建议使用反射的示例,但我不知道如何。
这是我正在尝试做的事情:
public List<string> ActionNames(string controllerName){
}
您还没有告诉我们为什么需要这个,但一种可能性是使用反射:
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();
}
显然,我们知道反射不是很快,所以如果你打算经常调用这个方法,你可以考虑通过缓存控制器列表来改进它,以避免每次都获取它,甚至记忆给定输入参数的方法。
对达林的回答稍作调整。我需要进行此更改以使其与 code lense 一起使用,因为它在不同的程序集下运行。
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();
}