Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从超类型克隆_C#_.net_Clone - Fatal编程技术网

C#从超类型克隆

C#从超类型克隆,c#,.net,clone,C#,.net,Clone,抽象超类型动物有许多子类型,猫、狗等。这些子类型只有一个构造函数和在动物中找到的虚拟方法的重写-即它们没有自己独有的属性或方法。Class Zoo有很多关于动物的参考资料和列表,但不知道或将永远需要知道猫、狗等。实现动物园深度复制的最佳方式是什么,最好在Cat、Dog等中使用很少或没有新代码。如果您关心的是需要创建一个新的克隆实现,只是为了获得正确的类型(因为基类中的此的类型是一个移动的目标),您可以使用Activator.CreateInstance创建当前类型的新实例,对于覆盖动物的所有类型

抽象超类型动物有许多子类型,猫、狗等。这些子类型只有一个构造函数和在动物中找到的虚拟方法的重写-即它们没有自己独有的属性或方法。Class Zoo有很多关于动物的参考资料和列表,但不知道或将永远需要知道猫、狗等。实现动物园深度复制的最佳方式是什么,最好在Cat、Dog等中使用很少或没有新代码。

如果您关心的是需要创建一个新的
克隆
实现,只是为了获得正确的类型(因为基类中的
的类型是一个移动的目标),您可以使用
Activator.CreateInstance
创建当前类型的新实例,对于覆盖动物的所有类型:

var copy = (Animal)Activator.CreateInstance(this.GetType());

copy.HasClaws = this.HasClaws; // copy Animal properties

您需要一个无参数构造函数才能使这个
Activator.CreateInstance
调用工作。

如果您关心的是需要创建一个新的
克隆
实现,只需获得正确的类型(因为基类中
this
的类型是一个移动目标),您可以使用
Activator.CreateInstance
为覆盖
Animal
的所有类型创建当前类型的新实例:

var copy = (Animal)Activator.CreateInstance(this.GetType());

copy.HasClaws = this.HasClaws; // copy Animal properties

您需要一个无参数的构造函数才能使这个
Activator.CreateInstance
调用起作用。

深入克隆对象的一个简单快捷的方法是将其序列化为
MemoryStream
,然后将其反序列化回对象图。反序列化的副本将是一个深度克隆图,没有对原始对象的引用。与手动克隆对象相比,它可能会占用更多的内存和CPU,但编码工作要少得多;最终结果通常是可以接受的

以下是一个来自以下方面的实现:


深入克隆对象的一种简单快捷的方法是将其序列化为
MemoryStream
,然后将其反序列化回对象图。反序列化的副本将是一个深度克隆图,没有对原始对象的引用。与手动克隆对象相比,它可能会占用更多的内存和CPU,但编码工作要少得多;最终结果通常是可以接受的

以下是一个来自以下方面的实现:


您可以将它们序列化到内存中,然后再次反序列化。这就是深度复制。需要示例吗?您可以将它们序列化到内存,然后再次反序列化。这就是深度复制。需要榜样吗?
ObjectCopier.Clone(objectBeingCloned);