Pregunta

Tengo un montón de nodos secundarios MDI que se crean todos de la misma manera y para reducir el código redundante me gustaría poder llamar a un método, pasarle una cadena (nombre del nodo secundario), hacer que cree el nodo y agréguelo al padre.

Puedo hacer todas las cosas excepto crear la clase a partir de una cadena de un nombre de clase, ¿cómo puedo hacer esto?

¿Fue útil?

Solución

Actualmente estoy usando esto en una de mis aplicaciones para actualizar una clase

public static IMobileAdapter CreateAdapter(Type AdapterType)
{
  return (IMobileAdapter)System.Activator.CreateInstance(AdapterType);
}

Está devolviendo una instancia de una clase que implementa IMobileAdapter, pero podría usarla igualmente fácilmente con una cadena:

public static IMyClassInterface CreateClass(string MyClassType)
{
  return (IMyClassInterface)System.Activator.CreateInstance(Type.GetType(MyClassType));
}

Llámelo usando un código similar al siguiente:

IMyClassInterface myInst = CreateClass("MyNamespace.MyClass, MyAssembly");

Por supuesto, la clase que crea debe implementar la interfaz IMyClassInterface en este caso, pero con una fábrica de clases, es probable que todas sus clases implementen la misma interfaz de todos modos.

Edición :

En referencia a su comentario, para el propósito de esta discusión, piense en el término "ensamblaje". como el conjunto de archivos dentro de su proyecto vb / cs. Supongo que está haciendo todo esto dentro de un solo proyecto [ensamblaje] y no se está extendiendo a varios proyectos.

En su caso, ya que sus clases extenderán el objeto Form, haría algo como esto.

Form myInst = CreateClass("MyExtendedForm");

O

Form myInst = CreateClass(Type.GetType("MyExtendedForm"));

Dependiendo de si obtiene el tipo dentro de su método CreateClass o fuera de él. Debería convertir su instancia al tipo correcto para acceder a los miembros personalizados. Considera esto:

class MyCustomForm : Form
{
    public int myCustomField{ get; set; }
}

Tengo un formulario personalizado que extiende Form agregando la propiedad myCustomField. Quiero crear una instancia de esto usando Activator.CreateInstance ():

public static Form CreateClass(string InstanceName)
{
    return (Form)System.Activator.CreateInstance(Type.GetType(InstanceName));
}

Luego lo llamo usando:

Form myInst = CreateClass("MyCustomForm");

Así que ahora tengo mi formulario personalizado almacenado en myInst. Sin embargo, para acceder a la propiedad personalizada [myCustomField], deberá convertir su instancia en la forma correcta:

int someVal = ((Type.GetType("MyCustomForm"))myInst).myCustomField;

Otros consejos

Activator.CreateInstance(Type.GetType(typeName))

Si tiene una cadena que es el nombre de la clase, entonces debería poder obtener un objeto Type a partir de ella, llamando a Type.GetType (string). A partir de ese tipo, debería poder usar la reflexión para generar un objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top