获取所有程序集中抽象类的所有派生类型
本文关键字:派生 类型 抽象类 程序集 程序 获取 集中 | 更新日期: 2023-09-27 18:24:15
我有一个库,里面有一个抽象类——假设是MyAbstractClass
。此库正由一个解决方案中的其他一些项目(一个应用程序)使用。
我想上所有这些课。我创建了示例Program
项目和包含MyAbstractClass
的Program.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.Load
或Assembly.LoadFile
,或者您可以使用任何方法显式加载它
问题出在CurrentDomain.GetAssemblies()只列出当前加载在应用程序域中的程序集。如果要获取应用程序中所有程序集中的类型,则需要确保(以某种方式)加载所有程序集。
手动加载组件的一种方法是使用以下代码行:
var assembly = Assembly.LoadFile(@filename)
您需要对每个文件执行上述操作,然后可以使用CurrentDomain.GetAssemblies().