C#深拷贝 反射实现
2016-07-07 09:32
435 查看
/// <summary> /// 对象拷贝 /// </summary> /// <param name="obj">被复制对象</param> /// <returns>新对象</returns> private object CopyOjbect(object obj) { if (obj == null) { return null; } Object targetDeepCopyObj; Type targetType = obj.GetType(); //值类型 if (targetType.IsValueType == true) { targetDeepCopyObj = obj; } //引用类型 else { targetDeepCopyObj = System.Activator.CreateInstance(targetType); //创建引用对象 System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers(); foreach (System.Reflection.MemberInfo member in memberCollection) { //拷贝字段 if (member.MemberType == System.Reflection.MemberTypes.Field) { System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member; Object fieldValue = field.GetValue(obj); if (fieldValue is ICloneable) { field.SetValue(targetDeepCopyObj, (fieldValue as ICloneable).Clone()); } else { field.SetValue(targetDeepCopyObj, CopyOjbect(fieldValue)); } }//拷贝属性 else if (member.MemberType == System.Reflection.MemberTypes.Property) { System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member; MethodInfo info = myProperty.GetSetMethod(false); if (info != null) { try { object propertyValue = myProperty.GetValue(obj, null); if (propertyValue is ICloneable) { myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null); } else { myProperty.SetValue(targetDeepCopyObj, CopyOjbect(propertyValue), null); } } catch (System.Exception ex) { } } } } } return targetDeepCopyObj; }
相关文章推荐
- C#输出后台打开的所有应用程序
- c# 客户端
- C#读写中文文件
- [C#6] 5-自动属性增强
- c#.net WinForm 线程内 调用窗体控件
- c#中的linq一
- c#中匿名函数lamb表达式
- C#桌面办公应用-工资管理系统系列六
- C#读取系统文件信息(二)——调API读取系统文件及系统盘Icon图标
- C#OpenFileDialog会改变当前路径
- 使用C# 未解决的问题(VS2012)
- C#之WCF
- C# UDP NAT 打洞 代码示例
- 使用C#和Thrift来访问Hbase实例
- 使用C#和Thrift来访问Hbase实例
- C# 在字符串指定位置之前插入新的字符串
- extern和DLLImport(c#)
- C# 判断远程文件是否存在
- 无废话WCF入门教程四[WCF的配置文件]
- [转]大白话系列之C#委托与事件讲解(三)