2009-01-11 124 views
18

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

回答

14

您可以通过预编译创建具有反射效果的高效,例如使用Expression。例如,like so

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

19

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

+0

所以我只想澄清,这将会是最好的,如果你对明确映射属性的每个类的自定义拷贝构造函数? – lomaxx 2009-01-11 23:02:43

+0

我会的。它有多难写?与基于反射的方法相比,一目了然更容易阅读。 – duffymo 2009-01-11 23:07:56

+0

是的,我会推荐这种方法。 – 2009-01-11 23:12:11

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号的值。 但是,如果使用深层复制,则只有第一个打印件会具有此功能,因为行没有相同的指针。

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

您可以参考valueinjecter和fasterflect的NuGet包和使用:

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