Domanda

Ho definito classe successiva con proprietà virtuali:

public class Order: BaseEPharmObject
{
    public Order()
    {
    }

    public virtual Guid Id { get; set; }
    public virtual DateTime Created { get; set; }
    public virtual DateTime? Closed { get; set; }
    public virtual OrderResult OrderResult { get; set; }
    public virtual decimal Balance { get; set; }
    public virtual Customer Customer { get; set; }
    public virtual Shift Shift { get; set; }
    public virtual Order LinkedOrder { get; set; }
    public virtual User CreatedBy { get; set; }
    public virtual decimal TotalPayable { get; set; }

    public virtual IList<Transaction> Transactions { get; set; }
    public virtual IList<Payment> Payments { get; set; }
}

e cercando di clonare gli oggetti di quella classe derivata. Come implementare un diritto copia profonda nella classe base?

È stato utile?

Soluzione

Se i tipi sono serializzabile è possibile utilizzare BinaryFormatter :

public static T DeepClone<T>(T obj)
{
    using (var stream = new MemoryStream())
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(stream, obj);
        stream.Position = 0;
        return (T)formatter.Deserialize(stream);
    }
}

Altri suggerimenti

Il modo migliore è generalmente quello di serializzare l'istanza e reidratare indietro come una nuova istanza. Un modo per farlo è descritto qui .

Il mio unico avvertimento per l'articolo è che non implementano questo come ICloneable - questa interfaccia è deprecato ed è fonte di confusione per i chiamanti della vostra classe. La cosa migliore sarebbe quella di spostare questa implementazione in un metodo di utilità e lo chiamano lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top