C# 用C语言克隆对象#

C# 用C语言克隆对象#,c#,deep-copy,cloning,C#,Deep Copy,Cloning,我用虚拟属性定义了下一个类: 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 Orde

我用虚拟属性定义了下一个类:

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; }
}
公共类顺序:basePharmObject
{
公共秩序()
{
}
公共虚拟Guid Id{get;set;}
创建的公共虚拟日期时间{get;set;}
公共虚拟日期时间?已关闭{get;set;}
公共虚拟OrderResult OrderResult{get;set;}
公共虚拟十进制余额{get;set;}
公共虚拟客户客户{get;set;}
公共虚拟移位{get;set;}
公共虚拟订单链接器{get;set;}
公共虚拟用户通过{get;set;}创建
公共虚拟小数{get;set;}
公共虚拟IList事务{get;set;}
公共虚拟IList付款{get;set;}
}

并尝试克隆该派生类的对象。如何在基类中实现深度复制权限?

最好的方法通常是序列化实例并将其重新水化为新实例。描述了实现这一点的一种方法

我对这篇文章的唯一警告是,不要将此实现为
ICloneable
——此接口已被弃用,并且会让类的调用者感到困惑。最好是将此实现移动到实用程序方法中,并在那里调用它。

如果您的类型是,您可以使用:

publicstatict-DeepClone(T-obj)
{
使用(var stream=new MemoryStream())
{
var formatter=新的二进制格式化程序();
序列化(流,obj);
流位置=0;
返回(T)格式化程序。反序列化(流);
}
}

您希望深度副本是基类的实例还是派生类的实例?这对您很有用
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);
    }
}