我正在尝试使用反射从我的解决方案中的任何控制器返回ActionResult的所有公共方法的列表,但我遇到了一些奇怪的行为。
Assembly asm = Assembly.GetAssembly(typeof(MyDLL.MvcApplication));
var controllerActionList = asm.GetTypes().ToList();
如果我运行上面的代码,我会得到所有类型的列表,包括我所有的模型和控制器等,就像我期望的那样。但是,如果我修改它并运行以下代码,我的结果列表将返回空白。知道这里发生了什么吗?我认为这应该过滤类型,所以我得到所有控制器的列表吧?
Assembly asm = Assembly.GetAssembly(typeof(MyDLL.MvcApplication));
var controllerActionList = asm.GetTypes()
.Where(type => typeof(Controller).IsAssignableFrom(type)).ToList();
答案 0 :(得分:0)
我使用下面的代码让它工作。我认为直接类型比较失败了,因为我相信我在这两个项目之间有两个不同的.net版本。
Assembly asm = Assembly.GetAssembly(typeof(SCCView.MvcApplication));
var controllerActionList = asm.GetTypes()
.Where(type => type.BaseType.Name == "Controller")
.SelectMany(type => type.GetMethods())
.Where(
m => m.IsPublic && m.ReturnType.Name == "ActionResult")
.Select(x => new {Controller = x.DeclaringType.Name, Action = x.Name})
.OrderBy(x => x.Controller).ThenBy(x => x.Action).ToList();
上面将为您提供一个控制器中返回ActionResult的每个公共方法的配对列表