2008-11-11 4 views
3

У меня есть код для загрузки сборки и получения всех типов, которые реализуют определенный интерфейс, например (предположим, что asm является допустимой и загруженной сборкой) ,Как работать с интерфейсом, динамически загружаемым из сборки и вызывать его члены

var results = from type in asm.GetTypes() 
    where typeof(IServiceJob).IsAssignableFrom(type) 
    select type; 

Теперь я застрял: Мне нужно создать экземпляры этих объектов и вызова методов и свойств объекта. И мне нужно сохранить ссылки на созданные объекты в массиве для последующего использования.

+0

Вы не дали понять, являются ли «методы и свойства», которые вы должны вызывать, произвольными или являются членами интерфейса IServiceJob. – AnthonyWJones 2008-11-11 10:55:25

ответ

11

О, вау - я только blogged about this несколько дней назад. Вот мой метод возвращать экземпляры всех типов, реализующих данный интерфейс:

private static IEnumerable<T> InstancesOf<T>() where T : class 
{ 
    var type = typeof(T); 
    return from t in type.Assembly.GetExportedTypes() 
      where t.IsClass 
       && type.IsAssignableFrom(t) 
       && t.GetConstructor(new Type[0]) != null 
      select (T)Activator.CreateInstance(t); 
} 

Если вы реорганизовать это принять параметр сборки, а не использовать сборку интерфейсной, она становится достаточно гибкой, чтобы удовлетворить ваши потребности.

+2

Это какой-то сумасшедший LINQ там человек. ;) – 2009-04-25 11:40:54

+0

@Matt Hamilton: можно ли тогда вызвать конструктор таким образом, чтобы не было пустого конструктора по умолчанию? – topwik 2009-08-20 13:28:26

1

Вы можете создать экземпляр типа с помощью метода Activator.CreateInstance: -

IServiceJob x = Activator.CreateInstance(type); 

Так что ваш код становится: -

IServiceJob[] results = (from type in asm.GetTypes() 
    where typeof(IServiceJob).IsAssignableFrom(type) 
    select (IServiceJob)Activator.CreateInstance(type)).ToArray(); 

(Примечание изменение вар в IServiceJob [], чтобы понять, что создается).

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

  • Нет связанных вопросов^_^