我有一个内部有抽象类的库 - 假设MyAbstractClass
。一个解决方案中的一些其他项目(一个应用程序)正在使用此库。
我想获得所有这些课程。我创建了包含Program
的示例Program.Library
项目和MyAbstractClass
。
我创建了两个派生自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)));
但是这个给了我一个空集......
答案 0 :(得分:1)
问题是CurrentDomain.GetAssemblies()仅列出当前在应用程序域中加载的程序集。 如果要获取应用程序中所有程序集中的类型,则需要确保(以某种方式)所有程序集都已加载。
手动加载程序集的一种方法是使用以下代码行:
var assembly = Assembly.LoadFile(@filename)
您需要为每个文件执行上述操作,然后您可以使用CurrentDomain.GetAssemblies()方法。
答案 1 :(得分:1)
当您致电Assembly.CurrentDomain.GetAssemblies()
时,您需要确保您要查看的所有程序集都已加载;
程序集在运行时需要时加载(即当您的程序到达代码中的某个点时,"使用"该程序集,或者如果您专门调用Assembly.Load
或Assembly.LoadFile
或您可以使用哪种方法来显式加载它