Ho un'interfaccia IExample
e un set di classi ClassOne
, ClassTwo
e ClassThree
, tutte definite in diversi spazi dei nomi. Eliminerò eventualmente una delle due classi o ne aggiungerò una nuova in una nuova posizione, in una fase successiva di sviluppo.Istanziare tutte le classi che implementano un'interfaccia specifica
Ora, voglio trovare tutti i tipi che implementano IExample
in fase di runtime e istanziarli. (So a priori che nessuna classe che implementa IExample
avrà mai bisogno di alcun argomento del costruttore, ma non so come specificarlo nel codice, quindi sono io - non il compilatore - che sa ...)
È questo possibile? Come faccio a farlo?
Update: "Non posso creare un'istanza di un'interfaccia" Ora ho provato diversi gli approcci suggeriti, ma su tutti, la linea Activator.CreateInstance(type)
, ottengo uno System.MissingMethodException perché io Questo è il mio codice:
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();
senza la clausola as
non vedo alcuna eccezione, ma sto dato un object[]
, e ho bisogno di un IBootstrapperTask[]
per il costruttore sull'ultima riga del brano. Ho provato vari modi per lanciarlo, ma nessuno sembra funzionare.
Ancora più importante, tuttavia, includerà solo assiemi che sono già stati * caricati *. Ci possono essere altri che sono stati * referenziati * ma non ancora caricati. Personalmente preferisco tenerlo tutto esplicito :) –