Usare il reflection per ottenere tutte le classi di un certo tipo di base in dll

Ho una DLL che contiene un numero di classi che tutti ereditano da una class CommandBase. Sto cercando di ottenere istanze di tutte queste classi (CommandA, CommandB, CommandC, ecc.) Usando il reflection in C # in modo da poter chiamare un metodo specifico su ciascuna di esse. Ecco cosa ho finora:

//get assemblies in directory. string folder = Path.Combine(HttpContext.Current.Server.MapPath("~/"), "bin"); var files = Directory.GetFiles(folder, "*.dll"); //load each assembly. foreach (string file in files) { var assembly = Assembly.LoadFile(file); if (assembly.FullName == "MyCommandProject") { foreach (var type in assembly.GetTypes()) { if (!type.IsClass || type.IsNotPublic) continue; if(type is CommandBase) { var command = Activator.CreateInstance(type) as CommandBase; } } } } 

Sto avendo 2 problemi. Il primo problema è che la riga “if (type is CommandBase”) fornisce il seguente avviso:

L’espressione data non è mai del tipo fornito CommandBase.

Il secondo problema è che non riesco a capire come ottenere un’istanza dell’object reale (CommandA, CommandB, ecc.), La conversione in CommandBase non è sufficiente.

Questo è il metodo che utilizzo per caricare basato su un’interfaccia.

 private static List GetInstances() { return (from t in Assembly.GetExecutingAssembly().GetTypes() where t.GetInterfaces().Contains(typeof (T)) && t.GetConstructor(Type.EmptyTypes) != null select (T) Activator.CreateInstance(t)).ToList(); } 

Ed ecco la stessa funzione che si ritira in base alla class base.

 private static IList GetInstances() { return (from t in Assembly.GetExecutingAssembly().GetTypes() where t.BaseType == (typeof(T)) && t.GetConstructor(Type.EmptyTypes) != null select (T)Activator.CreateInstance(t)).ToList(); } 

Ovviamente dovrebbe essere leggermente modificato per puntare al riferimento che stai caricando.

Il type is CommandBase modifica type is CommandBase per typeof(CommandBase).IsAssignableFrom(type)

Devi cambiare

 if(type is CommandBase) 

a

 if(type.IsSubclassOf(typeof(CommandBase))) 

Se IsSubclassOf è il contrario di IsAssignableFrom. Cioè, se t1.IsSclassOf (t2) è vero, allora anche t2.IsAssignableFrom (t1) è vero.

Questo perché la tua variabile type è un Type , non un CommandBase .

Tu vuoi

 if(type == typeof(CommandBase)) 

(Grazie Greg per la correzione)