Как работать с интерфейсом, динамически загруженным из сборки и вызывать его элементы
-
07-07-2019 - |
Вопрос
У меня есть некоторый код для загрузки сборки и получения всех типов, которые реализуют определенный интерфейс, например так (предположим, что asm является допустимой и загруженной сборкой).
var results = from type in asm.GetTypes()
where typeof(IServiceJob).IsAssignableFrom(type)
select type;
Теперь я застрял: мне нужно создавать экземпляры этих объектов и вызывать методы и свойства объекта. И мне нужно хранить ссылки на созданные объекты в массиве для последующего использования.
Решение
Ого, я только написал об этом в блоге a Несколько дней назад. Вот мой метод для возврата экземпляров всех типов, которые реализуют данный интерфейс:
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);
}
Если вы реорганизуете его, чтобы принять параметр сборки, а не использовать сборку интерфейса, он станет достаточно гибким, чтобы удовлетворить ваши потребности.
Другие советы
Вы можете создать экземпляр типа с помощью метода 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 [], чтобы было понятно, что создается).