2012-08-13 45 views
1

我有以下想做深层复制的类。包含界面的深度复制对象

public class KeyInfo 
{ 
    public KeyInfo(IKeySetup keySetup, IKeyData data) 
    { 
    KeySetup = keySetup; 
    Data = data; 
    } 

    public IKeySetup KeySetup { get; set; } 
    public IKeyData Data { get; set; } 

    public KeyInfo DeepCopy() 
    { 
    var keyInfo = (KeyInfo) this.MemberwiseClone(); 
    return keyInfo; 
    } 
} 

如何复制接口?我是否必须为接口实现ICloneable,然后让每个接口中的一个实现Clone()?有没有办法避免每个班级必须实施这样的功能?

+0

我想你的接口想暴露一个'DeepCopy'方法(而不是使用ICloneable,因为它不会推断它是浅层还是深层拷贝,也不是类型安全的)。你的'KeyInfo'类如何深度复制'SomeOtherCrazyIKeySetupImplementation'?您可以序列化/反序列化副本,但这取决于您的设计和实现。 – 2012-08-13 21:07:28

+0

@ChrisSinclair Plus,它将取决于接口是否可以连续化!递归属性或无限循环属性会在序列化练习中产生一个凹痕= D – Tejs 2012-08-13 21:09:50

+0

至于OP,听起来您可能想要实现实现接口的结构。这样,作为值类型,它们可以被简单地复制。不知道如果有帮助。 – Tejs 2012-08-13 21:10:44

回答

1

由于没有建立对象的深层副本的内置方法,因此您必须提供自己的副本才能这样做。

强制执行者IKeySetup/IKeyData将DeepCopy包含在界面中可能是个好主意。要求ICloneable可能是另一种方法 - 编译时间(通过从ICloneable推导出您的IKeySetup/IKeyData),或者如果对象不支持ICloneable,则通过显示来运行。

+4

只需要添加一下,如果你打算让接口实现一种克隆方法,就可以抛弃ICloneable,并用一个DeepClone方法实现你自己的IDeepCloneable接口,这个方法明确地表明你期待的开发者一个完整的深度克隆。 – 2012-08-13 21:13:52

0

您可以使用Fasterflect方法通过发射来复制对象。