【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆
【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆
CSFrameworkCloneExtends扩展类 C# Code: /// <summary> /// 对象克隆扩展方法 /// </summary> public static class CSFrameworkCloneExtends { /// <summary> /// 深度克隆对象列表 /// </summary> /// <param name="objs"></param> /// <returns></returns> public static IList CloneDeeply(this IList objs) { ArrayList list = new ArrayList(); foreach (object o in objs) { list.Add(CloneDeeply(o)); } return list; } /// <summary> /// 深度拷贝(使用.NET反射+递归原理实现对象深度克隆) /// </summary> /// <param name="obj"></param> /// <returns></returns> public static object CloneDeeply(this object obj) { object o = System.Activator.CreateInstance(obj.GetType()); //实例化一个T类型对象 PropertyInfo[] propertyInfos = obj.GetType().GetProperties(); //获取T对象的所有公共属性 foreach (PropertyInfo propertyInfo in propertyInfos) { object propertyValue = propertyInfo.GetValue(obj, null); if (propertyValue != null) { //判断值是否为空,如果空赋值为null if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { //如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换 NullableConverter nullableConverter = new NullableConverter(propertyInfo.PropertyType); //将convertsionType转换为nullable对的基础基元类型 propertyInfo.SetValue(o, Convert.ChangeType(propertyInfo.GetValue(obj), nullableConverter.UnderlyingType), null); } else { //支持克隆 if (propertyValue is ICloneable) { //将convertsionType转换为nullable对的基础基元类型 propertyInfo.SetValue(o, Convert.ChangeType((propertyValue as ICloneable).Clone(), propertyInfo.PropertyType), null); } else { object value; if (propertyValue is IList) //是列表对象 value = CloneList(propertyValue as IList, propertyInfo.PropertyType); else value = propertyValue; propertyInfo.SetValue(o, value, null); } } } } return obj; } /// <summary> /// 克隆对象列表 /// </summary> /// <param name="list"></param> /// <param name="listType"></param> /// <returns></returns> private static IList CloneList(IList list, Type listType) { IList ret = (IList)System.Activator.CreateInstance(listType); foreach (object obj in list) { ret.Add(obj.CloneDeeply()); } return ret; } } //来源:C/S框架网 | www.csframework.com | QQ:23404761 测试克隆单个对象(嵌套对象、以及对象列表) C# Code: //测试克隆单个对象(嵌套对象、以及对象列表) DemoData.MySupplierNested supplier = new DemoData.MySupplierNested { Code = "S001", Name = "供应商01", Tel = "0808-88889999", CreateTime = DateTime.Now, Level = 100 }; //构建对象列表实例, List<MySupplier> supplier.MySuppliers = DemoData.Suppliers; //构建单个对象实例, Type=MySupplier supplier.OnSupplier = new DemoData.MySupplier { Code = "SXXX", Name = "供应商XXXX", Tel = "XXXX-88889999" }; //深度克隆对象 DemoData.MySupplier clone = (DemoData.MySupplier)supplier.CloneDeeply(); //来源:C/S框架网 | www.csframework.com | QQ:23404761 测试克隆对象列表 C# Code: IList suppliers1 = DemoData.Suppliers; //测试克隆对象列表 IList suppliers2 = suppliers1.CloneDeeply(); //来源:C/S框架网 | www.csframework.com | QQ:23404761 扫一扫加微信
参考文档:
C#中实现对象的深拷贝(Deep Copy) C#.NET反射枚举窗体字段成员变量 C#.Net对象内存模型及堆/栈数据结构详解 (一) C#.Net对象内存模型及堆/栈数据结构详解 (二) C#.Net对象内存模型及堆/栈数据结构详解 (三) C#.Net对象内存模型及堆/栈数据结构详解 (四) C#.Net使用线程池(ThreadPool)与专用线程(Thread) C#.Net组件开发 - 设计时使用自定义属性编辑器持久化对象 标签:C#.Net组件开发 - 设计时持久化对象数组 标签:C#.Net组件开发 - 自定义设计器持久化对象的属性 标签:C#.Net组件开发 - 自定义属性编辑器持久化对象的属性 C#.NET 监视操作系统打开程序(使用Window消息实现全局系统勾子) C#.Net 持久化对象为XML文件 C# 实现对象浅拷贝Copy(极速复制对象) C# 克隆对象、复制对象(浅拷贝)、复制对象相同属性的值
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |