如何从不同程序集获取所有控制器类型(自定义远程验证场景)
跨程序集获取控制器类型的解决方案
我来帮你搞定这个跨程序集找控制器的问题~你之前的代码只局限在当前ViewModel所在的程序集里找,自然拿不到另一个程序集里的控制器,这里有两种实用的解决思路:
方法一:直接定位控制器所在程序集
如果明确知道控制器所在的程序集信息,直接加载目标程序集是效率最高的方式:
示例1:通过程序集名称加载
// 替换成你控制器实际所在的程序集名称,比如"MyWebApp.Controllers" var controllerAssembly = Assembly.Load("YourControllerAssemblyName"); string targetControllerName = $"{this.RouteData["controller"]}Controller"; Type controllerType = controllerAssembly.GetTypes() .FirstOrDefault(t => t.Name.Equals(targetControllerName, StringComparison.OrdinalIgnoreCase));
示例2:通过已知控制器类型获取程序集
如果你能引用到控制器所在程序集里的任意一个控制器(比如项目里的HomeController),可以用更可靠的方式获取程序集:
// 替换成你项目中实际存在的某个控制器类型 var controllerAssembly = typeof(HomeController).Assembly; string targetControllerName = $"{this.RouteData["controller"]}Controller"; Type controllerType = controllerAssembly.GetTypes() .FirstOrDefault(t => t.Name.Equals(targetControllerName, StringComparison.OrdinalIgnoreCase));
方法二:扫描所有已加载的程序集找控制器
如果不确定控制器具体在哪个程序集,或者项目里有多个程序集包含控制器,可以扫描当前应用域内所有已加载的程序集:
string targetControllerName = $"{this.RouteData["controller"]}Controller"; Type controllerType = AppDomain.CurrentDomain.GetAssemblies() // 过滤掉系统程序集和动态程序集,提升查找效率 .Where(a => !a.IsDynamic && !a.FullName.StartsWith("System.") && !a.FullName.StartsWith("Microsoft.")) .SelectMany(a => a.GetTypes()) // 筛选出继承自Controller的有效控制器类型,并且名称匹配 .Where(t => typeof(Controller).IsAssignableFrom(t) && !t.IsAbstract) .FirstOrDefault(t => t.Name.Equals(targetControllerName, StringComparison.OrdinalIgnoreCase));
小提示:
- 用
StringComparison.OrdinalIgnoreCase代替ToLower(),既能避免大小写问题,又比大小写转换更高效。 - 如果是ASP.NET Core的API项目,记得把判断基类改成
ControllerBase哦。
内容的提问来源于stack exchange,提问作者susankhya
相关产品推荐
相关产品推荐

