Referenciar propiedades de objetos

26/06/2007 - 04:48 por Geo | Informe spam
Tengo una clase que contiene muchas propiedades y necesito actualizar el
valor de algunas desde un archivo xml, por ejemplo:

class OrdenVenta {
... variables privadas ...

public string Id {
get { return _id; }
set { _id = value; }
}
public int Numero {
get { return _numero; }
set { _numero = value; }
}
... y tiene como 30 propiedades más ...
}

formato del archivo xml:
<OrdenVenta>
<Modificar campo="Numero" valor="45" />
<Modificar campo="Fecha" valor="25/06/2007" />
<Modificar campo="CodigoCliente" valor="MLT2384" />
... y así sucesivamente ...
</OrdenVenta>

Finalmente, se definió un objeto y se leyeron los campos y valores:

OrdenVenta miOrden = new OrdenVenta();
...
XmlReader reader = XmlReader.Create("configuracion.xml", settings);
...
campoNombre = reader.GetAttribute("campo");
campoValor = reader.GetAttribute("valor");
...

Ahora me gustaría evitar el código siguiente, en el que se tiene que
chequear cada propiedad:

if (campoNombre == "Numero")
miOrden.Numero = campoValor;
else if (campoNombre == "CodigoCliente")
miOrden.CodigoCliente = campoValor;

¿Hay alguna forma de hacer esto más eficientemente? Algún código como el
siguiente:

miOrden.Set(campoNombre, CodigoCliente);
...o...
miOrden[campoNombre] = CodigoCliente;

Gracias a todos!
 

Leer las respuestas

#1 Diego Jancic
26/06/2007 - 05:24 | Informe spam
Hola,
Porque no usas un reflection ?
Algo como:

MiClase objeto = new ...();

// Aca deberia comenzar un for...
PropertyInfo info = typeof(MiClase).GetProperty(campoNombre);

info.SetValue(objeto, castearValor(info.PropertyType, campoValor),
null);



Y para hacer el metodo castearValor tendrias que hacer algo como:

object castearValor(Type t, string valor)
{
if (t == typeof(int))
return int.Parse(valor);
if (t == typeof(double))
return double.Parse(valor);
if (t == typeof(string))
return valor;

return null;
}


De todas formas esto ultimo se puede hacer mejor si persistis el tipo
de la propiedad, pero creo que no vale la pena el esfuerzo...

Saludos,
Diego

Preguntas similares