![](/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.