Tengo una interfaz IExample
, y un conjunto de clases ClassOne
, ClassTwo
y ClassThree
, todas definidas en diferentes espacios de nombres. Posiblemente eliminaré cualquiera de las clases, o agregaré una nueva en un lugar nuevo, en una etapa posterior de desarrollo.Crear una instancia de todas las clases implementando una interfaz específica
Ahora, quiero encontrar todos los tipos que implementan IExample
en tiempo de ejecución, y ejemplificarlos. (Sé de antemano que ninguna clase que implementa IExample
necesitará siempre alguna argumentos de constructor, pero no sé cómo especificar que en el código, por lo que soy yo - no el compilador - que sabe ...)
¿Este ¿posible? ¿Cómo voy a hacerlo?
Actualización: ahora he probado varios de los enfoques sugeridos, pero en todos ellos, la línea Activator.CreateInstance(type)
, consigo un System.MissingMethodException porque "no se puede crear una instancia de una interfaz." Este es mi código:
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();
Sin la cláusula as
no veo ninguna excepción, pero me dio una object[]
, y necesito un IBootstrapperTask[]
para el constructor en la última línea en el extracto. He intentado varias formas de lanzarlo, pero ninguno parece funcionar.
Más importante aún, solo incluirá ensamblajes que ya hayan sido * cargados *. Puede haber otros que * han sido * referenciados * pero aún no están cargados. Personalmente prefiero mantener todo explícito :) –