Estoy tratando de ajustar mi cabeza a la reflexión, así que decidí agregar capacidad de complemento a un programa que estoy escribiendo. La única forma de entender un concepto es ensuciarse los dedos y escribir el código, así que fui por la ruta de crear una biblioteca de interfaz simple que constaba de las interfaces IPlugin e IHost, una biblioteca de implementación de complementos de clases que implementan IPlugin y un sencillo proyecto de consola que ejemplifica la clase de implementación IHost que hace un trabajo simple con los objetos del complemento.Cómo moldear adecuadamente los objetos creados a través de la reflexión
Al utilizar la reflexión, quise recorrer los tipos que figuran dentro de mi plugin implementation dll y crear instancias de tipos. Pude instanciar con éxito las clases con este código, pero no pude convertir el objeto creado a la interfaz.
He intentado este código pero no he podido lanzar el objeto o como esperaba. Pasé por el proceso con el depurador y se llamó al constructor adecuado. El objeto Quickwatching o me mostró que tenía los campos y las propiedades que esperaba ver en la clase de implementación.
loop through assemblies
loop through types in assembly
// Filter out unwanted types
if (!type.IsClass || type.IsNotPublic || type.IsAbstract)
continue;
// This successfully created the right object
object o = Activator.CreateInstance(type);
// This threw an Invalid Cast Exception or returned null for an "as" cast
// even though the object implemented IPlugin
IPlugin i = (IPlugin) o;
Hice que el código funcione con esto.
using System.Runtime.Remoting;
ObjectHandle oh = Activator.CreateInstance(assembly.FullName, type.FullName);
// This worked as I intended
IPlugin i = (IPlugin) oh.Unwrap();
i.DoStuff();
Aquí están mis preguntas:
- Activator.CreateInstance (tipo T) devuelve un objeto, pero no pude convertir el objeto a una interfaz que implementa el objeto. ¿Por qué?
- ¿Debo haber estado usando una sobrecarga diferente de CreateInstance()?
- ¿Cuáles son los consejos y trucos relacionados con la reflexión?
- ¿Hay alguna parte crucial de la reflexión que no estoy obteniendo?
Tal vez un poco exagerado para una aplicación simple, pero una alternativa es crear una biblioteca separada que solo contenga la interfaz y hacer referencia a ella de todo lo que necesite saber al respecto: o) – Andrew
Sí, tiene razón. esa también es una solución válida. –