如何通过多个程序集的接口有效地对所有实现进行分组
本文关键字:实现 有效地 何通过 程序集 接口 | 更新日期: 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};
我不知道这是否可以在一次迭代中完成,但我认为您需要首先知道哪些类型代表接口,然后才能找到哪些类实现这些接口。