什么是写我的C#类的通用拷贝构造函数的最佳方式? 他们都从一个抽象的基类继承,所以我可以使用反射来映射属性,但我想知道是否有更好的方法?通用C#拷贝构造函数
18
A
回答
14
您可以通过预编译创建具有反射效果的高效,例如使用Expression
。例如,like so。
对于深拷贝,序列化是最可靠的方法。
19
如果可以,请避免反射。每个类都应该有责任复制自己的属性,并将其进一步发送给基本方法。
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());
}
}
相关问题
- 1. 拷贝构造函数knowlege
- 2. 的拷贝构造函数
- 3. 拷贝构造函数++
- 4. C++中的拷贝构造函数
- 5. 基类的拷贝构造函数(C++)
- 6. 拷贝构造函数在C++
- 7. c#拷贝构造函数生成器
- 8. C#泛型拷贝构造函数
- 9. C++默认拷贝构造函数
- 10. C++拷贝构造函数语法
- 11. C++ std :: auto_ptr拷贝构造函数
- 12. 指针和拷贝构造函数C++
- 13. C++编程拷贝构造函数
- 14. 拷贝构造函数和operator =在C++
- 15. 一个拷贝构造函数调用
- 16. 拷贝构造函数不被调用?
- 17. D结构体拷贝构造函数
- 18. C++中的隐式定义的拷贝构造函数是否也为成员调用拷贝构造函数?
- 19. 拷贝赋值为未实现的拷贝构造函数
- 20. 为什么隐式拷贝构造函数调用基类拷贝构造函数并且定义的拷贝构造函数没有?
- 21. 移动构造函数和非常拷贝构造函数
- 22. Java ArrayList的拷贝构造函数是浅拷贝还是深拷贝?
- 23. 拷贝构造函数不叫
- 24. Java的拷贝构造函数
- 25. 私人拷贝构造函数:disallow
- 26. 堆栈拷贝构造函数
- 27. 避免向量拷贝构造函数
- 28. 模板拷贝构造函数
- 29. 拷贝构造函数的区别?
- 30. Java的ArrayList的拷贝构造函数
所以我只想澄清,这将会是最好的,如果你对明确映射属性的每个类的自定义拷贝构造函数? – lomaxx 2009-01-11 23:02:43
我会的。它有多难写?与基于反射的方法相比,一目了然更容易阅读。 – duffymo 2009-01-11 23:07:56
是的,我会推荐这种方法。 – 2009-01-11 23:12:11