给定以下类:
class A
{
public List<B> ListB;
// etc...
}
其中 B
是另一个可能继承/包含其他一些类的类。
鉴于这种情况:
A
是一个大类,包含很多引用类型- 我无法将
B
标记为[Serializable]
,因为我无权访问B
的源代码
以下执行深度复制的方法不起作用:
- 我不能使用
ICloneable
或MemberwiseClone
因为类A
包含许多引用类型 - 我无法为
A
编写复制构造函数,因为该类很大并且不断被添加,并且包含无法深度复制的类(如B
) - 我无法使用序列化,因为我无法将包含的类(如
B
,其中没有可用的源代码)标记为[Serializable]
如何深度复制类A
?
最佳答案
无论如何我都停止使用序列化进行深度复制,因为没有足够的控制(不是每个类都需要以相同的方式复制)。然后我开始实现自己的深拷贝接口(interface),按照应该拷贝的方式拷贝每一个属性。
复制引用类型的典型方法:
- 使用拷贝构造函数
- 使用工厂方法(例如不可变类型)
- 使用你自己的“克隆”
- 仅复制引用(例如其他根类型)
- 创建新实例并复制属性(例如,不是您自己编写的缺少复制构造函数的类型)
例子:
class A
{
// copy constructor
public A(A copy) {}
}
// a referenced class implementing
class B : IDeepCopy
{
object Copy() { return new B(); }
}
class C : IDeepCopy
{
A A;
B B;
object Copy()
{
C copy = new C();
// copy property by property in a appropriate way
copy.A = new A(this.A);
copy.B = this.B.Copy();
}
}
您可能认为这是一项巨大的工作量。但最后,它简单直接,可以在需要的地方进行调整,并完全按照您的需要进行。
关于c# - 如何在不将类标记为可序列化的情况下对其进行深度复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2545025/