实现方式

通过挨个罗列的方式一次复制子对象是非常耗费人力的,如果子对象是引用类型,则还要需要考虑是否对子对象进一步深拷贝。

实际应用中,一个类如果有几十个子对象,挨个复制对于开发人员来说索然无味比较费时费力。

所以使用反射机制来实现。

但是如果是服务端运行的话,还是建议手动的实现。

毕竟反射机制比直接写出来的效率要慢一些。

代码:

public static class DeepCopyHelper

{

public static object Copy(this object obj)

{

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, Copy(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)

{

object propertyValue = myProperty.GetValue(obj, null);

if (propertyValue is ICloneable)

{

myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null);

}

else

{

myProperty.SetValue(targetDeepCopyObj, Copy(propertyValue), null);

}

}

}

}

}

return targetDeepCopyObj;

}

}

以上这篇C# 使用反射来实现对象的深度复制方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

java 反射深度克隆_C# 使用反射来实现对象的深度复制方法相关推荐

  1. java 反射深度克隆_C#使用反射(Reflection)实现深复制与浅复制

    原文路径:https://blog.csdn.net/qq_28839293/article/details/79487294 1.浅复制: class Program { public static ...

  2. java中实现对象的深度克隆

    1.什么是深度拷贝和浅拷贝 python中有深度拷贝(也可以叫深度克隆)和浅拷贝,同样在java中很多时候需要深度拷贝对象,所谓的深度拷贝对象指的就是对于对象的所用数据及其全部进行copy一份,变成两 ...

  3. OpenCV运行对象检测深度学习网络的实例(附完整代码)

    OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 OpenCV运行对象检测深度学习网络的实例 #include <fstream> #include ...

  4. JAVA中N种单例模式简单概括(防反射,克隆,序列化,实例化,多线程安全)

    里面包括了老生常谈的饿汉式,懒汉式以及枚举类 静态代码块 序列化场景下,多线程场景下反射情况下的问题. 话不多说,直接开干. 饿汉式就是立即加载的意思,立即加载在中文中有着急,急迫的意思.所以就叫饿汉 ...

  5. Java深度克隆对象

    关于对象的克隆,Java自带了一个clone()方法. 但是众所周知,这个clone()方法只是做浅层的对象复制,仅适用于对象属性是简单数据类型(int/long/float等)的场景.对于对象属性是 ...

  6. java 反射 慢在那里_Java 反射到底慢在哪?

    反射具体是怎么影响性能的?这引起了我的反思. 是啊,在阐述某个观点时确实有必要说明原因,并且证明这个观点是对的,虽然反射影响性能人尽皆知,我曾经也真的研究过反射是否存在性能问题,但并没有在写文章的时候 ...

  7. java设计模——反射的应用 (利用反射来去除if判断语句)

    利用反射来去除if判断语句 我的以前写的一个查分系统,就是部长让我写的那个,使用一个分发器(函数),他会根据传递进来的字符串参数调用不同的方. If("add".equalsIgn ...

  8. java display.getdefault()_java基础(十一 )-----反射——Java高级开发必须懂的

    本文我们通过一个实际的例子来演示反射在编程中的应用,可能之前大家对反射的学习,仅仅是停留在概念层面,不知道反射究竟应用在哪,所以是一头雾水.相信通过这篇教程,会让你对反射有一个更深层次的认知. 概念 ...

  9. java泛型怎么用反射生成_Java 之 使用反射生成并操作对象

    一.使用反射创建对象 通过反射来生成对象有如下两种方式: 方式一: 使用 Class 对象的 newInstance() 方法来创建 Class 对象对应类的实例,这种方法要求该 Class 对象的对 ...

最新文章

  1. 微软亚洲研究院多媒体计算组招聘计算机视觉算法实习生
  2. mysql 不同连接的事务 会嵌套_MySQL——事务
  3. Java基础——左移和右移
  4. Sql Server 日志清理 (数据库压缩方法)
  5. SAP快速找到定制配置
  6. 【[网络流二十四题]最长不下降子序列问题】
  7. Spring Cloud微服务系列文,服务调用框架Feign
  8. hutool中身份证工具-IdcardUtil
  9. 【渝粤题库】国家开放大学2021春3929电气安全技术题目
  10. SSM之Mybatis框架高级
  11. 【Vue】—Vue的模板语法
  12. 用矩阵表示物体的缩放
  13. 关于云计算的讨论,一年就等这一回!
  14. 网络请求以及网络请求下载图片的工具类 android开发java工具类
  15. edraw linux版本,亿图图示Linux最新版下载-亿图图示Edraw Max Pro Linux 32/64位v8.6 官方最新版 - 极光下载站...
  16. screen linux卸载,Ubuntu常用软件安装(附截图软件、FTP、卸载命令)
  17. could not resolve property: qid of: org.lxh.myzngt.vo.Answer [SELECT COUNT(q.qid) FROM org.lxh.myzn
  18. Debian——roundcube报错及解决方法
  19. Stronger (What Doesn't Kill You)
  20. 中国电信上海电信光猫路由器设置和外接路由器

热门文章

  1. Cheggit解析器模块分析
  2. spring-boot使用教程(一):让程序跑起来
  3. IntelliJ Idea 常用12款插件(提高开发效率),附优秀主题插件
  4. 解决macbook pro散热问题
  5. vmware 12 安装centos7网络配置
  6. 算法(第4版) Chapter 5.2 单词查找树
  7. postgresql常用函数及操作符及类型转换
  8. oracle parameterfile
  9. Js中Number对象
  10. python3 协程 写法_理解Python的协程(Coroutine)