Método de extensión para clonar clase C#

En ocasiones necesitamos hacer una copia de una instancia, pero no queremos que nos arrastre los punteros a terceras, ya que queremos modificarlas sin que se vean alterados los valores del origen de la copia. La solución me la dio mi compañero Sergio Montes.

En principio montamos el método de extensión.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;

namespace DeepClone
{
    public static class ExtensionMethods
    {
        public static T CloneCompleto<T>(this T origen)
        {
            using (var memStream = new MemoryStream())
            {
                var formateadorBinario = new BinaryFormatter();
                formateadorBinario.Serialize(memStream, origen);
                memStream.Seek(0, SeekOrigin.Begin);
                return (T)formateadorBinario.Deserialize(memStream);
            }
        }
    }
}

El método es sencillo de comprender, simplemente se serializa en memoria y se desserializa en una clase nueva, por lo que el resultado es una copia exacta sin enlaces de punteros.
Gracias a los tipos genéricos, T, podremos llamar a este método desde cualquier clase. El siguiente paso es añadir la propiedad [Serializable] en la clase que queremos clonar.

    [Serializable]
    public class Prueba
    {
        public int Codigo { get; set; }
        public int Serie { get; set; }
        public double Base { get; set; }
        public double ImporteIVA { get; set; }
        public List<Prueba> ListaClasesHijos { get; set; }

        public Prueba Clone()
        {
            return this.CloneCompleto<Prueba>();
        }

    }

Como veis en el ejemplo simple tenemos una clase que se clona a sí misma.

Deja un comentario