如何在.net中查找程序集中特定接口的所有类

Max*_*Max 3 .net reflection design-patterns interface class

我有一个场景,我希望n个类可以查看相同的数据,并决定是否需要完成任何工作.工作由团队完成,多个团队可以同时处理数据.我正在考虑为每个实现CreateWork接口的团队创建一个类.所有CreateWork类都必须有发言权.目前只有少数,但将来会有更多.

我计划的解决方案的Sudo代码

For each CreateWork class in assembly
    class.CheckAndCreateWork(dataIn,returnedCollectionOfWorkToBeDone)
Next
Run Code Online (Sandbox Code Playgroud)

是否有一种设计模式可以以优雅的方式实现这一目标?循环遍历程序集中的每个类似乎有点乱.

干杯

Kon*_*man 9

您可以执行以下操作:

  1. 使用Assembly.GetTypes获取程序集中定义的所有类型.要获取运行代码的程序集的引用,请使用Assembly.GetExecutingAssembly.

  2. 对于每种类型,使用Type.IsAssignableFrom检查它是否实现了所需的接口.

  3. 对于每个适当的类型,使用Activator.CreateInstance创建实例.

它大致会像这样(未经测试):

foreach(var type in Assembly.GetExecutingAssembly().GetTypes()) {
    if(typeof(ITheInterface).IsAssignableFrom(type)) {
        var theInstance=(ITheInterface)Activator.CreateInstance(type);
        //do something with theInstance
    }
}
Run Code Online (Sandbox Code Playgroud)

  • IsAssignableFrom是要走的路,GetInterfaces只返回当前类型定义的接口,但不检查接口继承(IBar:IFoo).csc通过在类型上发出所有接口链简化了这一点,但并非所有编译器都这样做. (4认同)