У меня есть интерфейс IExample
, а набор классов ClassOne
, ClassTwo
и ClassThree
, все они определены в разных пространствах имен. Я, возможно, удалю любой из классов или добавлю новый в новое место на более позднем этапе разработки.
Теперь я хочу найти все типы, которые реализуют IExample
во время выполнения, и создавать их. (Я знаю заранее, что ни один класс, реализующий IExample
, никогда не будет нуждаться в каких-либо конструкторских аргументах, но я не знаю, как указать это в коде, чтобы он меня, а не компилятор, - который знает...)
Возможно ли это? Как мне это сделать?
Обновление: Теперь я попробовал несколько предложенных подходов, но на всех из них, строка Activator.CreateInstance(type)
, я получаю исключение System.MissingMethodException, потому что я не могу создать экземпляр интерфейс." Это мой код:
var tasks = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(t => typeof(IBootstrapperTask).IsAssignableFrom(t))
// This line is where it fails
.Select(t => Activator.CreateInstance(t) as IBootstrapperTask)
.ToArray();
new AutoMapperBootstrapper(tasks).Initialize();
Без предложения as
я не вижу никакого исключения, но мне присваивается object[]
, и мне нужен IBootstrapperTask[]
для конструктора на последней строке в выдержке. Я пробовал разные способы его бросить, но никто не работает.