我有几个我想要克隆的不同类:GenericRow
,GenericRows
,ParticularRow
和ParticularRows
。有以下类层次结构:GenericRow
是ParticularRow
的父级,GenericRows
是ParticularRows
的父级。每个类都实现ICloneable
,因为我希望能够创建每个类的实例的深层副本。我发现自己在每个类中为Clone()
编写完全相同的代码:
object ICloneable.Clone()
{
object clone;
using (var stream = new MemoryStream())
{
var formatter = new BinaryFormatter();
// Serialize this object
formatter.Serialize(stream, this);
stream.Position = 0;
// Deserialize to another object
clone = formatter.Deserialize(stream);
}
return clone;
}
然后我提供了一个方便的包装方法,例如GenericRows
:
public GenericRows Clone()
{
return (GenericRows)((ICloneable)this).Clone();
}
我很方便在每个类中查看相同的方便包装器方法,因为它的代码非常少,并且 通过返回类型,强制转换等在类之间有所不同。但是,{{ 1}}在所有四个类中都是相同的。我可以以某种方式抽象它,所以它只在一个地方定义?我担心的是,如果我制作了一些实用程序类/ ICloneable.Clone()
扩展方法,它将无法正确地复制我想要复制的特定实例。这无论如何都是个好主意吗?
答案 0 :(得分:2)
进入会议,所以只有时间向你抛出一些代码。
public static class Clone
{
public static T DeepCopyViaBinarySerialization<T>(T record)
{
using (MemoryStream memoryStream = new MemoryStream())
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, record);
memoryStream.Position = 0;
return (T)binaryFormatter.Deserialize(memoryStream);
}
}
}
来自Clone方法:
Clone()
{
Clone.DeepCopyViaBinarySerialization(this);
}
答案 1 :(得分:1)
实施ICloneable不是一个好主意(参见框架设计指南)。
使用BinaryFormatter实现Clone方法很有意思。
我实际上建议为每个类编写单独的Clone方法,例如
public Class1 Clone()
{
var clone = new Class1();
clone.ImmutableProperty = this.ImmutableProperty;
clone.MutableProperty = this.MutableProperty.Clone();
return clone;
}
是的,你对此重复了很多,但它仍然是恕我直言的最佳解决方案。