获取继承特定接口的类列表? [复制]

Posted

技术标签:

【中文标题】获取继承特定接口的类列表? [复制]【英文标题】:Getting a list of classes that inherit a specific interface? [duplicate] 【发布时间】:2019-01-31 06:08:59 【问题描述】:

我在我的项目中使用依赖注入,并且想知道是否只注册所有 30 多个继承某个接口的类使用 for each 会更容易,这样它就可以动态工作。

我在 Google、SO、RJ、YHA 和更多问答网站上查找过,但没有任何帮助。它只是说明您是否已经拥有它们的类的集合,而没有人向您展示如何仅从一个界面进行操作。

例如,我需要获取 Class1、2 和 3 以及任何其他继承 IClass 的类的列表。

class Class1 : IClass 
class Class2 : IClass 
class Class3 : IClass 

如果我稍后声明这些,它们也会被发现。

class Class4 : IClass 
class Class5 : IClass 
class Class6 : IClass 

【问题讨论】:

那么,你打算用它吗?你想将Class1 和所有其他人绑定到它自己吗?你要向 DI 容器请求Class1 吗? @Phiter 我不会说它是完全重复的,但如果 OP 决定使用反射来实现它,这是一篇有用的文章。 我要使用它,是的,@Phiter 我不想使用 LINQ。我还需要该类作为 TImplementation I don't want to use LINQ; ...为什么不呢? @fskdjwe:这不是题外话,因为您将其添加为限制并且可以在答案中使用。不过,如果您知道自己的原因,那也没关系。但是,请记住;很多 I don't want to use ... because it's ... 实际上很少是正确的,这就是人们钓鱼的原因。 【参考方案1】:

DI 容器通常会为此目的提供一些功能。例如,使用 Autofac,您可以像这样使用 Assembly Scanning:

var dataAccess = Assembly.GetExecutingAssembly();

builder
   .RegisterAssemblyTypes(dataAccess)
   .Where(t => t.Name.EndsWith("Repository"))
   .AsImplementedInterfaces();

此示例显示如何在执行程序集时注册所有存储库。因为你的组件实现了相同的接口,我想你可以找到一些命名模式来注册它们。

【讨论】:

我正在使用 MS 的 IServiceCollection,我认为它不支持这一点,尽管我可能是错的。 如果没有,您可以使用反射,如@Phiter已经提到的问题Getting all types that implement an interface所示

以上是关于获取继承特定接口的类列表? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

怎么通过反射获取所有继承了某一接口的类

C# - 字典 - 如何在字典中获取特定类值的最大值? [复制]

如何在 Solaris 中获取网络接口设备特定文件的列表 [重复]

Java 原始模型(Prototype)模式

为啥接口类型列表不能接受继承接口的实例? [复制]

如何从目录中获取特定数量的文件? [复制]