2009-01-23 11 views
5

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 hijo) , haga que cree el nodo y agréguelo al padre.Modelo de fábrica en C#

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

Respuesta

6

Actualmente estoy usando esto en una de mis aplicaciones a la nueva hasta una clase

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

Se devuelve una instancia de una clase que implementa IMobileAdapter, pero se puede utilizar con la misma facilidad con una cadena:

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

de llamadas usando un código similar al siguiente:

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

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

Editar:

En referencia a su comentario, para el propósito de esta discusión, pensamos en el término "montaje" como el conjunto de archivos dentro de su proyecto de VB/cs. Asumo que estás haciendo esto todo dentro de un único proyecto [ensamblaje] y no se extiende a múltiples proyectos.

En su caso, dado que sus clases extenderán el objeto Formulario, usted 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 ella. Debería enviar su instancia al tipo correcto para acceder a cualquier miembro personalizado. Considere esto:

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

Tengo un formulario personalizado que amplía el formulario que agrega la propiedad myCustomField. Quiero crear una instancia de esta usando Activator.CreateInstance():

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

entonces me llaman usando:

Form myInst = CreateClass("MyCustomForm"); 

así que ahora tengo mi formulario personalizado almacenado en MYINST. Sin embargo, para acceder a la propiedad personalizada [myCustomField], lo que se necesita para emitir su instancia a la forma correcta:

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

Todas las clases se extienden formulario. ¿Te importa explicar qué es un montaje? – Malfist

0

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

3
Activator.CreateInstance(Type.GetType(typeName))