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();
...