为我的 c# 类编写通用复制构造函数的最佳方法是什么?它们都继承自抽象基类,因此我可以使用反射来映射属性,但我想知道是否有更好的方法?
lomaxx
问问题
31229 次
5 回答
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 个数字的值。然而,对于深拷贝,只有第一个打印会有这个,因为行没有相同的指针。
于 2009-01-11T23:09:58.503 回答
19
如果可以,请避免反思。每个类都应该负责复制自己的属性,并将其进一步发送到基方法。
于 2009-01-11T23:00:38.460 回答
15
您可以通过预编译通过反射有效地创建浅拷贝,例如使用Expression
. 例如,像这样。
对于深拷贝,序列化是最可靠的方法。
于 2009-01-11T23:13:38.540 回答
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; }
}
于 2012-05-01T21:10:10.830 回答
0
您可以参考 valueinjecter 和 fastflect nuget 包并使用:
public class Myclass()
{
private string _property;
public MyClass(MyClass obj)
{
this.InjectFrom(obj.DeepClone());
}
}
于 2017-11-30T12:50:46.140 回答