C # полиморфизм - загрузка классов из DLL-файлов - PullRequest
3 голосов
/ 18 января 2009

Ответы, которые я получил на на этот вопрос , решили проблему, с которой я столкнулся в этом вопросе, но мне интересно, возможно ли ее немного расширить. Например, если бы мне нужно было, чтобы третьи лица передавали команды в эту систему, был бы способ расширить первый ответ на мой предыдущий вопрос, чтобы он мог загрузить все команды из всех библиотек DLL в папке, а затем перечислить их в списке.

Это возможно? Сможет ли он работать со списком ICommand (как предложено в ответе на мой предыдущий вопрос).

Ответы [ 2 ]

5 голосов
/ 18 января 2009

Да.

 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.

1 голос
/ 18 января 2009

Вы можете загрузить каждую сборку в каталог, выполнить итерацию по каждому открытому классу в сборке, а затем проверить реализацию вашей ICommand. Оттуда вы можете добавить их во внутреннюю систему, создав новый экземпляр этих объектов.

Некоторые места для проверки ошибок:

  • Сборочная нагрузка, убедитесь, что это CLR.
  • Конструкция: убедитесь, что он не требует каких-либо параметров и что у него есть открытый конструктор.
  • Конструкция: убедитесь, что это не абстрактный класс.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...