3ENGINE  programmer :-)

viernes 13 de marzo de 2009

Clonar or not clonar: that is the question

Programando yo el otro día en c#... necesitaba realizar un copia integra de un objeto, pero duplicando direcciones de memoria, es decir un objeto completamente nuevo pero que contenga los mismos datos... me interesaba que fuera una rutina universal que me sirviera para copiar cualquier objeto independientemente de su tipo.


A partir del artículo de Christian Bigentini descubrí que utilizando técnica de serialización y deserialización podia hacer lo que me proponia.

Pero por otro lado, me interesaba que el método que realiza una copia de mi objeto estuviera de algun modo asociado al tipo... para esto, lo mejor es utilizar las extensiones, una técnica que c# ha incluido a partir de la versión 3.0.

El código resultante es éste:




public static class MyExtensions
{
public static MiTipo Copia(this MiTipo plugin)
{
MemoryStream ms = new System.IO.MemoryStream();
BinaryFormatter bf = new BinaryFormatter(null,
new StreamingContext(StreamingContextStates.Clone));
bf.Serialize(ms, plugin);
ms.Seek(0, SeekOrigin.Begin);
MiTipo copia = (MiTipo)bf.Deserialize(ms);
ms.Close();
return copia;
}
}

Un ejemplo de su uso:




using espacio.nombres.declaracion.extensiones
...
MiTipo objeto1 = new MiTipo();
objeto1.propiedad = "hola";
MiTipo objeto2 = objeto1.Copia();
...

Etiquetas:


Comentarios:

Publicar un comentario en la entrada





<< Página principal


   

Categorias

Archivos

 
Feed Blog suscríbete!      Contacto     Terminos & Condiciones © 3ENGINE 2007