2011-06-03 12 views
6

Hola, es posible crear nuevas clases en C#, clasifique las lecturas de la aplicación desde XML y declare que son atributos que también leen desde XML. como:Es posible crear nuevas clases en RunTime C#

<item id=1> 
<Name>John</Name> 
<Surname>Kennedy</Surname> 
<Age>24</Age> 
</item> 

mejores.

+0

Qué quiere decir en realidad crear una nueva, nunca antes visto, * Tipo *, o simplemente una nueva instancia * * de una existente ¿tipo? –

+0

si está tratando de crear una clase con el xml anterior, entonces lamentablemente es inadecuado. Por ejemplo, ¿cuál sería el tipo de edad? int, uint, short, byte? ¿O desea almacenar todos los campos como una cadena? –

+0

Parece que está intentando crear una instancia del elemento tipo ('Persona') en lugar de crear un tipo nuevo. –

Respuesta

9

Sí, lo es con el espacio de nombres System.Reflection.Emit.

Pero en .NET 4.0 puede usar keywoard dinámico para esto. Al igual que este http://blogs.msdn.com/b/mcsuksoldev/archive/2010/02/04/dynamic-xml-reader-with-c-and-net-4-0.aspx

sin dinámica, incluso si se crea nueva clase, necesitará reflexión para acceder a sus propiedades

+1

Buena referencia. –

+0

También agregaría que probablemente no necesite una clase completamente nueva, y trabajar con XML generalmente se hace con LINQ to XML. –

0

¡Puede deserializar este XML en una nueva clase! Pruebe algo como esto:

public static T DeserializeObject<T>(string filePath) 
    { 
     XmlDocument doc = new XmlDocument(); 
     doc.Load(filePath); 
     XmlNodeReader reader = new XmlNodeReader(doc.DocumentElement); 
     XmlSerializer ser = new XmlSerializer(typeof(T)); 
     object obj = ser.Deserialize(reader); 

     return (T)obj; 
    } 
+0

Él no está buscando crear nuevos Objetos. Creo que la estructura del archivo XML no se conoce en tiempo de compilación. Él está pidiendo la creación de nuevas clases. –

+0

+1; No creo que quede claro a partir de la pregunta original si el póster desea crear un nuevo tipo, o simplemente para deserializar xml a un tipo existente. Creo que este último es más probable. – Polyfun

+0

@ShellShock no sé todo Parte de XML solo algunas cosas, pero los nodos que el usuario puede nombrar ¡Sea lo que sea, digamos que tenemos una persona con 4 nombres! En ese caso, no quiero usar String [] o genéricos Necesito declarar 4 Cuerdas como Nombre1 Nombre2 Nombre3 Nombre4. – Burimi

0

Tiene que usar Reflection api para hacer eso, que es algo complicado. Por favor describe tu escenario. Tal vez hay enfoques más simples.

0

Realmente no tiene sentido. Como C# está fuertemente tipado, no sabrá en el tipo de compilación cómo se ve el objeto, por lo que no podrá usarlo.

Tal vez sea mejor crear un objeto que utilice un diccionario con la clave como nombre de nodo. Luego puede consultar el diccionario para encontrar qué propiedades tiene.

+0

Bueno, mi amigo que estoy planeando tener mis Criterios XML y el Usuario que quiera usar Mi Aplicación debería construirlo en XML, pero el PROBLEMA es que no quiero Poner un Criterio FUERTE para que el Usuario sepa qué poner, pero dónde ponerlo. ¡Los valores y los artículos no serían un problema si puedo alcanzar la META EN MI pregunta! @Ray – Burimi

2

Sí, lo es.

Here puede encontrar cómo hacerlo.

Pero en lugar de esto también puede almacenar esta estructura en un Mapa, donde la clave es id y el valor es otro mapa que almacena las propiedades donde la clave es el nombre y los valores es el valor.

Cuestiones relacionadas