繁体   English   中英

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

[英]Get all derived types of an abstract class within all the assemblies

我有一个内部有抽象类的库-假设为MyAbstractClass 一个解决方案中的某些其他项目(一个应用程序)正在使用此库。

我想上所有这些课。 我创建了包含MyAbstractClass示例Program项目和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)));

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

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

手动加载程序集的一种方法是使用以下代码行:

var assembly = Assembly.LoadFile(@filename)

您需要对每个文件执行上述操作,然后才能使用CurrentDomain.GetAssemblies()方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM