2009-01-17 65 views
3

我得到的迴應this question已經解決了我在這個問題中遇到的問題,但我想知道是否可以擴展它一點。例如,如果我要讓第三方向這個系統提供命令,是否有辦法將我的上一個問題的第一個答案擴展爲允許它從一個文件夾中的所有DLL加載所有命令,然後列出它們在列表框中。C#多態 - 從DLL文件加載類

這可能嗎?它能夠使用ICommand列表(作爲我之前提出的問題的答案)。

回答

5

是的。

Assembly commandAssembly = Assembly.Load("some/path") 
var commands = new List<ICommand>(); 

foreach (Type type in commandAssembly.GetTypes()) 
{ 
    if (type.GetInterface(typeof(ICommand).FullName) != null) 
    { 
     commands.Add((ICommand)Activator.CreateInstance(type)); 
    } 
} 

但是,您可能會遇到關於程序集加載的一些限制。你不能從任何地方加載程序集,否則你可能會重新實現像COM DLL DLL這樣的東西。

+0

這種加載類型的最佳做法是隻加載子目錄中的程序集。 – 2009-01-17 22:28:56

1

您可以將每個程序集加載到目錄中,遍歷程序集中每個暴露的類,然後檢查ICommand的實現。然後,您可以通過創建這些對象的新實例將它們添加到您的內部系統。

錯誤檢查有些地方:

  • 大會負荷,確保它是CLR。
  • 構造:確保它不需要任何參數,並且它具有公共構造函數。
  • 構造:確保它不是一個抽象類。