![](/img/trans.png)
[英]Get a List<Type> of all derived types in a list of objects that inherit from an abstract class
[英]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.Load
或Assembly.LoadFile
或可用于显式加载它的任何方法,则将其加载)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.