在几个类中干掉ICloneable的实现

时间:2010-05-26 17:22:41

标签: c# clone dry abstraction deep-copy

我有几个我想要克隆的不同类:GenericRowGenericRowsParticularRowParticularRows。有以下类层次结构:GenericRowParticularRow的父级,GenericRowsParticularRows的父级。每个类都实现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()扩展方法,它将无法正确地复制我想要复制的特定实例。这无论如何都是个好主意吗?

2 个答案:

答案 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;
}

是的,你对此重复了很多,但它仍然是恕我直言的最佳解决方案。