C# 查看控制器列表

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

我对c语言中的反射有些陌生。我试图生成所有控制器的列表,以便测试它们是否用特定的actionfilter修饰。编写单元测试时,如何访问被测试的程序集

这似乎不起作用:

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结尾,所以你可以去掉这部分。