//Método que pide implementar por ICloneable
        public object Clone()
        {
            ParaClonar objClon = this.MemberwiseClone() as ParaClonar;

            objClon.Nombre        = this.Nombre;
            objClon.Valor         = this.Valor;
            objClon.detalle       = new Detalle();
            objClon.detalle.Clase = this.detalle.Clase;
            //Es un método de ICloneable que permite crear una copia superficial
            return(objClon);
        }
        static void Main(string[] args)
        {
            ParaClonar oC1 = new ParaClonar();

            oC1.Nombre  = "ejemplo A";
            oC1.Valor   = 10;
            oC1.detalle = new Detalle();

            oC1.detalle.Clase = "Original";

            //Observar que por más que oC2 apunte a oC1, en realidad
            //estoy clonando, es unca copia
            ParaClonar oC2 = oC1.Clone() as ParaClonar;

            oC2.Nombre        = "ejemplo B";
            oC2.detalle.Clase = "Copia";

            //El nombre va a cambiar, pero que hice un Clon, el número al no sobreescribirlo, toma el valor del primero
            //con el arreglo en CLONE eso se resuelve
            Console.WriteLine("Texto 1: " + oC1.Nombre + " Valor 1: " + oC1.Valor + "Clase: " + oC1.detalle.Clase);
            Console.WriteLine("Texto 2: " + oC2.Nombre + " Valor 2: " + oC2.Valor + "Clase: " + oC2.detalle.Clase);
        }