簡體   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