我正在实现自定义远程验证,我需要获取所有控制器,为此我使用了代码:
Type controller = Assembly.GetExecutingAssembly().GetTypes()
.FirstOrDefault(type => type.Name.ToLower() == string.Format("{0}Controller",this.RouteData["controller"].ToString()).ToLower());
但是,问题是我的控制器和viewModel在两个不同的程序集上,因此Assembly.GetExecutingAssembly()不会获得任何控制器。上面的代码是在我有一个视图模型的程序集中。 如何从不同的装配中获得所有控制器。
答案 0 :(得分:0)
我将假设您的第二个程序集由第一个程序集引用(持有您的视图模型的程序集)。您只需要获取引用的程序集并检查它是否已经加载,如果没有,则加载它然后只需调用 GetTypes ,就像执行程序集一样。这是一幅草图:
var assemblies = executingAssembly.GetReferencedAssemblies();
var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToArray()();
foreach (var assemblyName in assemblies)
{
var assembly = loadedAssemblies.FirstOrDefault(a => a.FullName == assemblyName.FullName) ??
AppDomain.CurrentDomain.Load(assemblyName);
Type controller = assembly.GetTypes()
.FirstOrDefault(type => type.Name.ToLower() == string.Format("{0}Controller",this.RouteData["controller"].ToString()).ToLower());
}