【术】c#中利用反射实现深拷贝
2015-11-25 19:59
381 查看
c#中深拷贝不常用,但是需要的时候如果没有,实在是麻烦的很。今天聊天,中梁大神说他实现了一个,赶紧学习学习。废话少说,直接上代码。
总体思路就是利用反射拿到字段(Field),然后拷贝字段。
[code]using System; using System.Collections; using System.Collections.Generic; using System.Reflection; public class CloneHelper { public static object Clone(object obj) { Type type = obj.GetType(); object clone_obj = System.Activator.CreateInstance(type); Copy(clone_obj, obj, type); return clone_obj; } public static void Copy<T>(T dst, T src) { Copy(dst, src, typeof(T)); } static void Copy(object dst, object src, Type type) { if (type.IsGenericType) { if (type.GetInterface("IList") != null) { IList list_obj = src as IList; IList list_clone_obj = dst as IList; foreach (object ele in list_obj) { Type ele_type = ele.GetType(); if (ele_type.IsPrimitive || ele_type.IsValueType || ele_type == typeof(String)) { list_clone_obj.Add(ele); } else { list_clone_obj.Add(Clone(ele)); } } return; } else if (type.GetInterface("IDictionary") != null) { IDictionary dict_obj = src as IDictionary; IDictionary dict_clone_obj = dst as IDictionary; foreach (object key in dict_obj.Keys) { object value = dict_obj[key]; Type key_type = key.GetType(); if (key_type.IsPrimitive || key_type.IsValueType || key_type == typeof(String)) { if (key_type.IsPrimitive || key_type.IsValueType || key_type == typeof(String)) { dict_clone_obj.Add(key, value); } else { dict_clone_obj.Add(key, Clone(value)); } } else { if (key_type.IsPrimitive || key_type.IsValueType || key_type == typeof(String)) { dict_clone_obj.Add(Clone(key), value); } else { dict_clone_obj.Add(Clone(key), Clone(value)); } } } return; } } FieldInfo[] fields = type.GetFields(); foreach (FieldInfo field in fields) { if (field.IsStatic) { continue; } if (field.FieldType.IsPrimitive || field.FieldType.IsValueType || field.FieldType == typeof(String)) { field.SetValue(dst, field.GetValue(src)); } else { object field_value = field.GetValue(src); if (field_value != null) { field.SetValue(dst, Clone(field_value)); } } } } }
总体思路就是利用反射拿到字段(Field),然后拷贝字段。
相关文章推荐
- C#中通过Selenium IWebDriver实现人人网相册备份工具
- C# FTP 上传 下载(汇总)
- C# FTP 上传 下载(汇总)
- WPF中C#代码触发鼠标点击事件
- C# 上传下载ftp(支持断点续传)
- C# 上传下载ftp(支持断点续传)
- csharp: 百度语音合成
- c#后台常用知识
- c#实现动态加载Dll
- C# 关于Get和Set的疑惑
- C# 继承
- C#读取设置Cookie
- C#
- csharp:百度语音识别
- C#Winfrom如何测试当前设备是否处理联网状态。
- C#数据类型
- csharp: Sound recording
- c#字符相似度对比
- C# 获取DataTable数据导出到Excel
- c# 替换非法字符