2010-04-06 2 views
4

я определил следующий класс с виртуальными свойствами:Клонирование объектов в 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; } 
} 

и пытается клонировать объекты этого производного класса. Как реализовать глубокую копию в базовом классе?

+0

Вы хотите, глубокая копия быть экземпляром базового класса или экземпляр производного класса? – Eric

+0

@ Eric Derived класс – akrisanov

+1

это сработает для вас http://valueinjecter.codeplex.com/wikipage?title=Deep%20Cloning&referringTitle=Home – Omu

ответ

7

Если типы serializable вы можете использовать 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

Лучший способ - это, как правило, сериализовать экземпляр и повторно закрепить его как новый экземпляр. Один из способов сделать это описан here.

Мое единственное предостережение в этой статье заключается в том, что это не следует использовать как ICloneable - этот интерфейс устарел и запутывает вызывающих пользователей вашего класса. Лучше всего было бы переместить эту реализацию в метод утилиты и вызвать ее там.

Смежные вопросы