Tengo un dll que contiene varias clases que todas heredan de una clase CommandBase. Estoy tratando de obtener instancias de todas estas clases (CommandA, CommandB, CommandC, etc ...) usando la reflexión en C# para poder llamar a un método específico en cada una de ellas. Esto es lo que tengo hasta ahora:Uso de la reflexión para obtener todas las clases de cierto tipo base en dll
//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;
}
}
}
}
Tengo 2 problemas. El primer problema es que la línea "if (type es CommandBase") da la siguiente advertencia:
La expresión dada nunca es del tipo provisto CommandBase.
El segundo problema es que no puedo entender cómo obtener una instancia del objeto real (CommandA, CommandB, etc ...), simplemente convertirlo a CommandBase no es suficiente.
¿Su última línea no crea correctamente la instancia? 'Con Activator.CreateInstance()', debe tener una instancia de CommandA, CommandB ... clase (dependiendo de 'tipo'), ¿no? –
Activation.CreateInstance() devuelve type object. – Justin
Sí, pero devuelve un objeto del tipo que proporcionó. Puede almacenarlo en var de "objeto" o var de "CommandBase", seguirá siendo una instancia de CommandA, CommandB, etc. Puedes lanzarlo más tarde a su tipo "real". No tengo un Visual Studio para verificar pero no veo cuál es el problema. –