2010-04-19 19 views
6

Lo que intento hacer es cargar objetos desde un archivo de salvar XML. El problema es que esos objetos son configurables por el usuario en tiempo de ejecución, lo que significa que tuve que usar la reflexión para obtener los nombres y atributos de esos objetos almacenados en un archivo XML.Creación genérica de objetos en C#

Estoy en medio de un bucle recursivo a través del XML y hasta la parte donde tengo que crear un objeto se lo pensó ..... ah - ni idea de cómo hacer eso :(

I tiene una matriz rellena de objetos vacíos (m_MenuDataTypes), uno de cada tipo posible. mi función recursiva de carga se ve así

private void LoadMenuData(XmlNode menuDataNode) 
{ 
    foreach (object menuDataObject in m_MenuDataTypes) 
    { 
     Type menuDataObjectType = menuDataObject.GetType(); 
     if (menuDataObjectType.Name == menuDataNode.Name) 
     { 
      //create object 
     } 
    } 
} 

tengo que poner un poco de código en la que mi comentario es, pero no puedo tener un gran cambio declaración o cualquier cosa. Los objetos en mi matriz pueden cambiar dependiendo de cómo el usuario ha configurado la aplicación.

+0

¿Podemos ver un fragmento de ese XML? – devnull

+0

E echo @devnull - ¿podríamos ver el XML, por favor? –

+0

Realmente no puedo publicar porque es totalmente regala lo que la aplicación es y esto es código de la compañía - lo siento chicos sólo imaginar su estructura anidada habitual como pecera peces siluro sexual_orientation = "así homosexuales"/ special_abilities cazón = "toca la flauta"/ /fish /fishtank ese tipo de cosa – DrLazer

Respuesta

13

que desea utilizar Activator.CreateInstance(Type)

object instance = Activator.CreateInstance(menuDataObjectType); 

para que esto funcione de manera eficiente, es posible que tenga que restringir las instancias creadas dinámicamente para implementar una interfaz

ICommonInterface i = (ICommonInterface)Activator.CreateInstance(menuDataObjectType) 

De esta manera, el objeto creado de forma dinámica se convierte en utilizable - puede invocar métodos de interfaz en él.

+1

si el activador devuelve un tipo de "objeto" ¿es parseable a su tipo real? Por ejemplo, si lo rellenara en una ArrayList, ¿podría hacer algo como if (el objeto [4] es TurboButton)? – DrLazer

+1

El objeto devuelto es una instancia del tipo que pasó a CreateInstance. Puedes devolverlo a tu tipo. (o use el operador is, etc.). hay varias sobrecargas de CreateInstance que debe observar, incluida una que acepta un nombre de tipo de cadena y un nombre de ensamblado de cadena. – JMarsch

+0

bueno uno hará – DrLazer

2

Si va a crear instancias de un gráfico de objetos, habría XmlSerializer o DataContractSerializer ser más apropiado?

+0

Sí, es una buena idea, pero tengo un requisito para que sea fácilmente legible por humanos: '( – DrLazer

+0

No hay razón por la que no debe ser limpio y ordenado si especifica suficientes detalles en los atributos en sus clases. –

+0

Además, ya hay una carga de otras funcionalidades en la aplicación que se ocupa de esos archivos XML en los que trabajan otros píos: ya sabe el crack. Si dependiera de mí, lo guardaríamos como encriptado gash – DrLazer