获取继承特定接口的类列表? [复制]
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# - 字典 - 如何在字典中获取特定类值的最大值? [复制]