2015-01-14 2 views
0

Я пытаюсь загрузить типы из DLL, которые все реализуют интерфейс. Я хочу иметь возможность получить типы из DLL, создать и экземпляр каждого типа, а затем обработать каждый тип, как если бы он реализовал интерфейс. Я написал базовый пример ниже того, чего я пытаюсь достичь.Могу ли я рассматривать объект как реализацию интерфейса от отражения?

Спасибо за вашу помощь

class Program 
    { 
     private static List<IJob> _jobs; 

     static void Main(string[] args) 
     { 
      LoadJobs(); 

      foreach (var job in _jobs) 
      { 
       job.Run(); 
      } 

      Console.ReadKey(); 
     } 

     static void LoadJobs() 
     { 
      _jobs = new List<IJob>(); 

      var jobsPath = Directory.GetFiles(@"C:\Jobs\"); 

      foreach (var file in jobsPath) 
      { 
       var assembly = Assembly.LoadFrom(file); 

       foreach (var type in assembly.GetExportedTypes()) 
       { 
        var instance = Activator.CreateInstance(type); 
        var job = instance as IJob; 

        if(job != null) 
         _jobs.Add(job); 
       } 
      } 
     } 
    } 
+0

Вы смешиваете два понятия. 'type' является' Type', вы рассматриваете его как экземпляр. 'type as IJob' никогда не будет правдой. –

+0

Если вы хотите проверить, реализует ли тип * интерфейс *, вы можете сделать это следующим образом: 'type.GetInterfaces(). Содержит (typeof (IJob))' –

+0

Извините, я хотел добавить в экземпляр перед тем, как я разместил сообщение. Я не знаю, возможно ли это или нет. – DanMarionette

ответ

0
foreach (var type in assembly.GetExportedTypes().Where(t => t.IsAssignableFrom(typeof (IJob)))) 
{ 
    var job = Activator.CreateInstance(type) as IJob; 
    if(job != null) _jobs.Add(job); 
} 
+0

@DanMarionette это решило вашу проблему? – DoronG

Смежные вопросы