通用C#复制构造函数

时间:2009-01-11 22:56:21

标签: c# constructor copy

为我的c#类编写通用复制构造函数的最佳方法是什么? 它们都从一个抽象基类继承,所以我可以使用反射来映射属性,但我想知道是否有更好的方法?

5 个答案:

答案 0 :(得分:23)

复制构造函数基本上意味着你有一个参数,这是你要复制的对象。

另外,做一个深拷贝,而不是浅拷贝。

如果您不知道深层和浅层副本是什么,那么这就是交易:

假设您正在复制一个具有单行整数的类作为字段。

浅层副本将是:

public class Myclass()
{
    private int[] row;
    public MyClass(MyClass class)
    {
        this.row = class.row
    }
}

深拷贝是:

public class Myclass()
{
    private int[] row;
    public MyClass(MyClass class)
    {
        for(int i = 0; i<class.row.Length;i++)
        {
            this.row[i] = class.row[i];
        }
    }
}

深拷贝确实获取了实际值并将它们放在新对象的新字段中,而浅拷贝只复制指针。

如果设置了浅色副本:

row[3] = 5;

然后打印两行,两个打印将具有5作为第4个数字的值。 但是,使用深层复制时,只有第一个打印才会有这个,因为行没有相同的指针。

答案 1 :(得分:19)

如果可以,请避免反思。每个类都应该负责复制自己的属性,并将其进一步发送到基本方法。

答案 2 :(得分:14)

您可以通过预编译来反射创建浅层副本高效,例如使用Expression。例如,like so

对于深层拷贝,序列化是最可靠的方法。

答案 3 :(得分:9)

这是我正在使用的构造函数。请注意,由于我的基类的性质,这是一个浅构造函数,而且相当简单。应该足够让你开始。

public partial class LocationView : Location
{
    public LocationView() {}

    // base class copy constructor
    public LocationView(Location value) {
        Type t = typeof(Location);
        PropertyInfo[] properties = t.GetProperties();
        foreach (PropertyInfo pi in properties)
        {
            pi.SetValue(this, pi.GetValue(value, null), null);
        }
    }
    public Quote Quote { get; set; }
}

答案 4 :(得分:0)

您可以参考valueinjecter和quickflect nuget包并使用:

public class Myclass()
{
    private string _property;
    public MyClass(MyClass obj)
    {
         this.InjectFrom(obj.DeepClone());
    }
}