反映控制器列表
我对c#中的反思有点新意。 我正在尝试生成所有控制器的列表,以便测试它们是否使用特定的actionfilter进行修饰。 编写unit testing时,如何访问测试的组件?
这似乎不起作用:
var myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
如果您知道主程序集中的类型,则可以使用:
private IEnumerable 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)
的基类中使用this.GetType()
,以便我可以引用定义了derrived类型的程序集。
在编写测试时,您将知道程序集的名称。 使用Assembly.ReflectionOnlyLoad()
是此方案的合适选择。
或者,您可以从Assembly
集中的任何单个已知类型的Assembly
属性中进行绘制。
Assembly.GetAssemblyByName()
可能是查找除您之外的程序集的票证。 它将查看应用程序的程序集绑定,然后在当前应用程序目录中,然后在GAC中。 您还可以通过调用GetType().Assembly
来获取给定对象实例或静态引用类型的GetType().Assembly
。
在此Assembly类中,您可以使用GetExportedTypes()
将其中包含的类型作为Type对象进行GetExportedTypes()
。 这将仅返回公共类型; 如果您静态引用程序集,则可以访问的那些。 您可以通过任何可以反思分析的内容来过滤这些内容; 名称,父类型,成员名称,装饰class级或任何成员的属性等。