Клонирование объектов в C # - PullRequest
4 голосов
/ 06 апреля 2010

Я определил следующий класс с виртуальными свойствами:

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

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

Ответы [ 2 ]

7 голосов
/ 06 апреля 2010

Если ваши типы сериализуемые , вы можете использовать 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 голосов
/ 06 апреля 2010

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

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

...