我仍然如何列出控制器和操作(也许通过反射?)
是的,反思是一种方法。下面是一个如何获取所有控制器类型列表的示例:
public IEnumerable<Type> GetControllers()
{
IEnumerable<Type> typesSoFar = Type.EmptyTypes;
var assemblies = BuildManager.GetReferencedAssemblies();
foreach (Assembly assembly in assemblies)
{
Type[] typesInAsm;
try
{
typesInAsm = assembly.GetTypes();
}
catch (ReflectionTypeLoadException ex)
{
typesInAsm = ex.Types;
}
typesSoFar = typesSoFar.Concat(typesInAsm);
}
return typesSoFar.Where(type =>
type != null &&
type.IsPublic &&
type.IsClass &&
!type.IsAbstract &&
typeof(IController).IsAssignableFrom(type)
);
}
然后您可以获得ActionDescriptor
每种控制器类型的列表:
foreach (var controller in GetControllers())
{
ActionDescriptor[] actions = new ReflectedControllerDescriptor(controller).GetCanonicalActions();
foreach (var action in actions)
{
// here you know everything about the action
}
}