2

我知道如何獲得實現接口的所有類型,例如使用此codeApi控制器獲取實現接口的所有類型

但是我還沒有想出爲什麼我不能在我的Asp.Net MVC ApiController中進行這項工作。我有兩個項目(道歉的命名慣例我創建了一個從無到有的解決方案只是爲了確保我的現有不是錯誤的原因。):

.sln 
-WebAPI 
-ClassLibrary1 
    -Interface1 
    -Class1 : Interface1 

的WebAPI有一個項目引用ClassLibrary1的。

調用我的ApiController它會查看bin目錄中的dll。它能夠獲得ClassLibrary1.dll,但是當它試圖查看哪種類型可從Interface1分配時,它找不到任何東西。

enter image description here

代碼僅僅是一個.NET MVC項目和類庫和託管here

回答

0

的問題是,必須從參考加載兩次,因此ClassLibrary1.Interface1組裝ClassLibrary1是不相同的接口ClassLibrary1.Interface1從加載組件。

Interface1移動到它自己的共享庫中,並在ClassLibrary1WebAPI中引用此共享庫來解決您的問題。

關於Assembly.LoadFile,如果您打算製作一個像系統的插件,這很好。如果您正在引用庫,則不需要這樣做,因爲那樣您就可以枚舉已加載的程序集中的類型。

在這種情況下,你可以使用:

typeof(Interface1).Assembly.GetTypes().Where(c => typeof(Interface1).IsAssignableFrom(c)); 

的建議通過Bhushan Firake

+0

我接受了這個答案,因爲我正在做一個像系統這樣的插件,並且將引用移動到共享庫上解決了這個問題。另一個答案也有幫助。 –

1

你不需要它的路徑找到引用的組件,你可以使用類型來獲取其裝配如下:

internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var type = typeof(Interface1); 
      Assembly loadedAssembly = type.Assembly; 
      var types = loadedAssembly.GetTypes().Where(c => type.IsAssignableFrom(c)); 

      foreach (var typeFound in types) 
      { 
       Console.WriteLine(typeFound.Name); 
      } 

      Console.ReadKey(); 
     } 
    } 

輸出:

INTE rface1

的Class1

相關問題