如何通过多个程序集的接口有效地对所有实现进行分组

本文关键字:实现 有效地 何通过 程序集 接口 | 更新日期: 2023-09-27 18:28:02

我想使用Linq创建一个分组,它将返回由正在实现的接口键控的所有实现类型。

基本上,给定多个程序集中的多个类型,我希望获得至少有一个实现符合特定条件的所有接口,然后对于这些接口,我需要获得所有实现。

例如,假设我有以下类:

interface IDoX {}
interface IDoY {}
interface IDoZ {}
class Impl1 : IDoX, IDoY {}
class Impl2 : IDoY {}
class Impl3 : IDoY, IDoZ {}
class Impl4 : IDoX, IDoY, IDoZ {}

对这些类和接口进行分组,我应该会得到这样的结果(例如,以字典的形式):

{
    IDoX, {Impl1, Impl4},
    IDoY, {Impl2, Impl3, Impl4},
    IDoZ, {Impl3, Impl4}
}

我需要这一点,因为我必须分析给定接口的所有实现才能做出决定,而且我需要在所有加载的程序集中这样做。

我正试图想出一些东西,但由于反射类都会向另一个方向返回结果,所以这样做有点奇怪。例如,要获得给定接口的所有实现,我需要搜索所有程序集,然后检查每个类型是否实现了接口。

这种查找构建的天真方法会导致大量的迭代。有没有一种干净的方法来实现我需要的这种分组,或者我将不得不对所有程序集上的所有类型进行疯狂的重复迭代?

如何通过多个程序集的接口有效地对所有实现进行分组

也许还有更好的方法,但你可以尝试这样的方法:

  var alltypes=AppDomain.CurrentDomain.GetAssemblies().SelectMany(a=>a.GetTypes()); //change "AppDomain.CurrentDomain.GetAssemblies()" for your assemblies collection
  var q = from t in alltypes
          where t.IsInterface 
          let classes = alltypes.Where(s => s.IsClass && t.IsAssignableFrom(s))
          where classes.Count() > 0 
          select new { Interface=t,Classes=classes};

我不知道这是否可以在一次迭代中完成,但我认为您需要首先知道哪些类型代表接口,然后才能找到哪些类实现这些接口。