gpt4 book ai didi

c# - 如何通过来自多个程序集的接口(interface)有效地对所有实现进行分组?

转载 作者:太空宇宙 更新时间:2023-11-03 15:28:24 25 4
gpt4 key购买 nike

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

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

例如,假设我有这些类:

interface IDoX {}

interface IDoY {}

interface IDoZ {}

class Impl1 : IDoX, IDoY {}

class Impl2 : IDoY {}

class Impl3 : IDoY, IDoZ {}

class Impl4 : IDoX, IDoY, IDoZ {}

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

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

我需要这个,因为我必须分析给定接口(interface)的所有实现才能做出决定,而且我需要对所有加载的程序集执行此操作。

我正在尝试想出一些办法,但由于反射类都在另一个方向上给我返回结果,所以这样做有点奇怪。例如,要获取给定接口(interface)的所有实现,我需要搜索所有程序集,然后检查每种类型是否实现了该接口(interface)。

这种查找构建的幼稚方法会导致疯狂的迭代次数。是否有一种干净的方法来实现我需要的这种分组,或者我是否必须对所有程序集的所有类型进行疯狂的重复迭代?

最佳答案

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

  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};

我不知道这是否可以在一次迭代中完成,但我认为您首先需要知道什么类型代表接口(interface),以便稍后找到哪些类实现了这些接口(interface)。

关于c# - 如何通过来自多个程序集的接口(interface)有效地对所有实现进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34453883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com