一个克隆对象的C#基类

原创 2003年08月15日 18:27:00

一个克隆对象的C#基类<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

By Amir Harel

投递于 2002, 12, 30

 

摘要一个实现ICloneable接口的类。

应用于:C#, .NET

 

Download source files - 1.27 Kb

简介

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

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

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

  1. 查看一下类中的每一个字段是否支持ICloneable接口

  2. 如果某字段不支持ICloneable接口那么该字段将以常规方式处理。这意味着,如果该字段是一个值类型,那么该值被拷贝;如果该字段是一个引用类型,克隆的字段将指向同一个对象。

  3. 如果该字段支持ICloneable接口我们将使用其本身的Clone方法对其进行克隆。

  4. 如果该字段支持IEnumerable接口我们需要检查他是否支持IList IDictionary 接口如果支持,那么我们迭代该集件并且查看集合的每一项是否支持ICloneable接口。

如何使用

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

}

现在在Main方法中加入如下代码:

当监测con2实例时,你将会看到MyClass实例的第一项已经变为5,而con1实例却没有改变。这样你将明白加入到类中的任意支持ICloneable接口的字段将被同样地克隆。而且,如果该字段支持IList IDictionary 接口,克隆方法将侦测该字段,轮询所有项,并同样地试图对他们进行克隆

实现

 

 /// </summary>

     public object Clone()

         object newObject  = Activator.CreateInstance( this.GetType() );

         FieldInfo[] fields = newObject.GetType().GetFields();

             Type ICloneType = fi.FieldType.

                 ICloneable IClone = (ICloneable)fi.GetValue(this);

                 fields[i].SetValue( newObject , fi.GetValue(this) );

 
               Type IListType = fields[i].FieldType.GetInterface

                     IList list = (IList)fields[i].GetValue(newObject);

                         ICloneType = obj.GetType().

 

 

                         ICloneType = de.Value.GetType().

 

                                                                                    (完)

 

参看原文:Base class for cloning an object in C#

C#中如何深度克隆一个对象?

C#中如何深度克隆一个对象? ASP.NETAsp.net.Net其他C#代码片段 Share 如何深度克隆一个对象? 普通版: public...
  • yinbucheng
  • yinbucheng
  • 2017年03月16日 10:44
  • 1189

C# 克隆一个对象(实例)

代码一: using System; using System.Reflection; namespace conTest {     class person     {       ...
  • u011010558
  • u011010558
  • 2014年04月07日 12:25
  • 3038

C#中完美克隆引用类型的对象

我们都知道,在C#中,对于复杂对象,每声明一个牸类型的变量a,并用个该类型的对象A给这个变量赋值的时候,其实是让这个变量a指向了对象A,在内存中并没有多生成一个对象A的实例.所以不管我们声明多少个等于...
  • Luckeryin
  • Luckeryin
  • 2009年09月16日 17:11
  • 6749

C# Exception所有异常对象的基类

Exception:所有异常对象的基类。   SystemException:运行时产生的所有错误的基类。   IndexOutOfRangeException:当一个数组的下标超出范围时运行时引...
  • bushuaibucai
  • bushuaibucai
  • 2012年03月06日 11:56
  • 2696

C# 浅克隆与深克隆

一、浅克隆:      在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量...
  • zhulongxi
  • zhulongxi
  • 2016年09月23日 17:53
  • 3675

C#的基类都有哪些方法

之前面试有被问到这个问题,平时没去注意,回答的不好,在此整理一下。 在C#中,Object类型是所有类型的根。Object类型中一共有8个方法,重载的方法没有算进来: 构造函数 ToString...
  • bigpudding24
  • bigpudding24
  • 2015年10月12日 09:25
  • 1329

【设计模式】对象的克隆-原型模式

原型模式是对象的创建模式。原型模式使用原型实例指定创建对象的类型,通过克隆原型来创建新的对象,其实就是复制对象。        原型模式在我们的生活中处处都存在,大家应该用过很多软件,都有模板,就拿我...
  • LZGS_4
  • LZGS_4
  • 2015年04月20日 16:11
  • 980

类Object---所有对象的基类 简介

一、类Object简介 1、类Object是 .NET Framework 中所有类、结构、枚举和委托的最终基类。 2、C#通常不要求类显示声明从 Object 的继承,因为继承是隐式的。 3...
  • susan19890313
  • susan19890313
  • 2011年11月14日 19:34
  • 3680

克隆(Clone)与销毁(Destroy)对象

今天写点Unity中经常用到的Clone与Destroy。在游戏中,有的游戏对象会反复的使用,比如子弹,如果一直创建子弹对象,那么它会占很大的游戏资源,而且还不知道子弹的数量有多少,子弹实现了它的使命...
  • qq_35390518
  • qq_35390518
  • 2017年03月12日 16:03
  • 1651

jQuery 克隆对象的简单示例

简单例子  代码如下 复制代码 // 浅层复制(只复制顶层的非 object 元素)  var newObject = jQuery.extend({}, oldOb...
  • luyaran
  • luyaran
  • 2016年11月14日 16:02
  • 2243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个克隆对象的C#基类
举报原因:
原因补充:

(最多只允许输入30个字)