You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从不同程序集获取所有控制器类型(自定义远程验证场景)

跨程序集获取控制器类型的解决方案

我来帮你搞定这个跨程序集找控制器的问题~你之前的代码只局限在当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:08:15