Как работать с интерфейсом, динамически загруженным из сборки и вызывать его элементы - PullRequest
3 голосов
/ 11 ноября 2008

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

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

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

Ответы [ 2 ]

11 голосов
/ 11 ноября 2008

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

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);
}

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

1 голос
/ 11 ноября 2008

Вы можете создать экземпляр типа с помощью метода 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();

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

...