C#中实现任意类的完美克隆

本文介绍了一种利用反射在C#中创建一个基类BaseObject,实现ICloneable接口,以实现任意类的深度克隆。通过检查字段是否支持ICloneable和IEnumerable接口,对字段进行不同程度的克隆,确保值类型和引用类型的正确复制。这种方法避免了手动实现克隆逻辑,简化了代码维护。
摘要由CSDN通过智能技术生成

简介

虽然在现实世界中的克隆课题是有争议的, 在.NET世界使用它却足够安全, 难道不是吗?

为实现一个类你究竟有多少次要实现ICloneable接口, 而且每一次都写相同的代码,或为每个类写特定的代码。而且,当你的类加入一个新的字段时,往往会忘记更新这个新字段的克隆方法。如果我没说错的话,这种时候往往会带来恼人的bugs。

这是我的类得以存在的原因。 藉由反射机制的小小帮助,我建立了一个用缺省行为实现了ICloneable接口的抽象类。现在或许你正在问自己: 什么是缺省行为? 那么我很高兴你这样询问。 克隆的缺省行为,是采用以下的规则来克隆类中的每一个字段:

  • 查看一下类中的每一个字段是否支持ICloneable接口
    如果某字段不支持ICloneable接口,那么该字段将以常规方式处理。这意味着,如果该字段是一个值类型,那么该值被拷贝;如果该字段是一个引用类型,克隆的字段将指向同一个对象。
    如果该字段支持ICloneable接口,我们将使用其本身的Clone方法对其进行克隆。
    如果该字段支持IEnumerable接口,我们需要检查他是否支持IList 或 IDictionary 接口。如果支持,那么我们迭代该集件,并且查看集合的每一项是否支持Cloneable接口。

如何使用

让你的类支持Icloneable接口所要做的就是,将你的类继承自如下所述的BaseObject类:

public class MyClass : BaseObject 
{ 
	public string myStr ="test"; 
	public int id; 
} 
public class MyContainer : BaseObject 
{ 
	public string name = "test2"; 
	public MyClass[] myArray= new MyClass[5]; 
	public class MyContainer() 
	{ 
		for(int i=0 ; i<5 ; i++) 
		{ 
			this.my
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值