C# 查看控制器列表
我对c语言中的反射有些陌生。我试图生成所有控制器的列表,以便测试它们是否用特定的actionfilter修饰。编写单元测试时,如何访问被测试的程序集 这似乎不起作用:C# 查看控制器列表,c#,unit-testing,asp.net-mvc-2,reflection,C#,Unit Testing,Asp.net Mvc 2,Reflection,我对c语言中的反射有些陌生。我试图生成所有控制器的列表,以便测试它们是否用特定的actionfilter修饰。编写单元测试时,如何访问被测试的程序集 这似乎不起作用: var myAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 如果您知道主程序集中的类型,则可以使用: private IEnumerable<Type> GetControllers() { return fr
var myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
如果您知道主程序集中的类型,则可以使用:
private IEnumerable<Type> GetControllers()
{
return from t in typeof(MyType).Assembly.GetTypes()
where t.IsAbstract == false
where typeof(Controller).IsAssignableFrom(t)
where t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)
select t;
}
将MyType替换为已知类型
我在基类this.GetType中使用它,而不是typeofMyType,这样我就可以引用定义了驱动类型的程序集。编写测试时,您将知道程序集的名称。对于此场景,使用是一个合适的选择 或者,您可以从程序集的任何已知类型的程序集属性中进行绘制。Assembly.GetAssemblyByName可能是查找程序集以外的程序集的票证。它将查看应用程序的程序集绑定,然后查看当前应用程序目录,然后查看GAC。您还可以通过调用GetType.Assembly获得给定对象实例或静态引用类型的程序集类
从这个程序集类中,您可以使用GetExportedTypes作为类型对象遍历其中包含的类型。这将只返回公共类型;如果静态引用程序集,则可以访问的。你可以通过任何你可以反射分析的东西来过滤这些信息;名称、父类型、成员名称、修饰类或任何成员的属性等。谢谢John。一个问题:where typeofController.IsAssignableFrom不足以确认它是控制器类型吗?我对Linq也有点陌生,顺便说一句:是的,那应该足够了。我刚看了MVC的源代码,看起来他们不在乎它是否以Controller结尾,所以你可以去掉这部分。