反映控制器列表

时间:2010-09-09 21:09:39

标签: c# unit-testing asp.net-mvc-2 reflection

我对c#中的反思有点新意。我正在尝试生成所有控制器的列表,以便测试它们是否使用特定的actionfilter进行修饰。编写单元测试时,如何访问测试的组件?

这似乎不起作用:

var myAssembly = System.Reflection.Assembly.GetExecutingAssembly();

3 个答案:

答案 0 :(得分:4)

如果您知道主程序集中的类型,则可以使用:

    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()而不是typeof(MyType)的基类中使用它,以便我可以引用定义 the derrived type 的程序集。

答案 1 :(得分:0)

在编写测试时,您将知道程序集的名称。对于这种情况,使用Assembly.ReflectionOnlyLoad()是一个合适的选择。

作为替代方法,您可以从程序集中的任何单个已知类型的Assembly属性中进行绘制。

答案 2 :(得分:0)

Assembly.GetAssemblyByName()可能是寻找除你之外的装配的门票。它将查看应用程序的程序集绑定,然后在当前应用程序目录中,然后在GAC中。您还可以通过调用GetType().Assembly获取给定对象实例或静态引用类型的Assembly类。

在此Assembly类中,您可以使用GetExportedTypes()将其中包含的类型作为Type对象进行迭代。这将仅返回公共类型;如果您静态引用程序集,则可以访问的那些。您可以通过任何可以反思分析的内容来过滤这些内容;名称,父类型,成员名称,装饰班级或任何成员的属性等。