获取所有程序集中抽象类的所有派生类型

本文关键字:派生 类型 抽象类 程序集 程序 获取 集中 | 更新日期: 2023-09-27 18:24:15

我有一个库,里面有一个抽象类——假设是MyAbstractClass。此库正由一个解决方案中的其他一些项目(一个应用程序)使用。

我想上所有这些课。我创建了示例Program项目和包含MyAbstractClassProgram.Library

我已经创建了两个从MyAbstractClass派生的测试类。一个在第一个项目中(Test1Class),一个在第二个项目(Test2Class)。

我尝试了这个代码来找到我想要的:

var list = Assembly.CurrentDomain.GetAssemblies().SelectMany(a => a.GetTypes())
                                .Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof (MyAbstractClass)));

它工作了,但只找到了Test1Class(因为——我想——它和上面给出的执行代码放在同一个程序集中?)。我不知道如何在整个应用程序的所有程序集中找到所有派生类。

我也试过:

var list = Assembly.GetAssembly(typeof(MyAbstractClass)).GetTypes()
                                .Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof (MyAbstractClass)));

但这个给了我一个空的收藏。。。

获取所有程序集中抽象类的所有派生类型

调用Assembly.CurrentDomain.GetAssemblies()时,需要确保要查找的所有程序集都已加载;程序集在运行时需要时加载(即,当程序到达代码中"使用"该程序集的点时,或者如果您专门调用Assembly.LoadAssembly.LoadFile,或者您可以使用任何方法显式加载它

问题出在CurrentDomain.GetAssemblies()只列出当前加载在应用程序域中的程序集。如果要获取应用程序中所有程序集中的类型,则需要确保(以某种方式)加载所有程序集。

手动加载组件的一种方法是使用以下代码行:

var assembly = Assembly.LoadFile(@filename)

您需要对每个文件执行上述操作,然后可以使用CurrentDomain.GetAssemblies().

方法