2010-04-06 4 views
4

je définis classe suivante avec des propriétés virtuelles:objets de clonage en C#

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; } 
} 

et d'essayer de cloner des objets de cette classe dérivée. Comment implémenter une copie profonde directement dans la classe de base?

+0

Voulez-vous que la copie profonde d'être une instance de la classe de base ou une instance d'une classe dérivée? – Eric

+0

@ Eric classe dérivée – akrisanov

+1

cela fonctionnera pour vous http://valueinjecter.codeplex.com/wikipage?title=Deep%20Cloning&referringTitle=Home – Omu

Répondre

7

Si vos types sont serializable vous pouvez utiliser 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); 
    } 
} 
0

La meilleure façon est généralement sérialiser l'instance et le réhydrater retour comme une nouvelle instance. Une façon de le faire est décrite here. Mon seul inconvénient à l'article est que ne pas implémenter cela comme ICloneable - cette interface est obsolète et prête à confusion pour les appelants de votre classe. La meilleure chose serait de déplacer cette implémentation dans une méthode utilitaire et de l'appeler ici.