Клонирование объектов в 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; }
}

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


person akrisanov    schedule 06.04.2010    source источник
comment
Вы хотите, чтобы глубокая копия была экземпляром базового класса или экземпляром производного класса?   -  person Eric    schedule 06.04.2010
comment
это сработает для вас valueinjecter.codeplex.com/   -  person Omu    schedule 08.02.2011


Ответы (2)


Если ваши типы сериализуемы, вы можете использовать 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);
    }
}
person Darin Dimitrov    schedule 06.04.2010

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

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

person Andrew Hare    schedule 06.04.2010