C# 使用反射来实现对象的深度复制方法

发布时间 - 2026-01-10 22:37:05    点击率:

实现方式

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

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

所以使用反射机制来实现。
 
但是如果是服务端运行的话,还是建议手动的实现。

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

代码:

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# 使用反射来实现对象的深度复制方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# C#  # 反射实现对象的深度复制  # C#表达式树Expression动态创建表达式  # C# 快速高效率复制对象(表达式树)  # C#使用表达式树实现对象复制的示例代码  # 给大家  # 来实现  # 希望能  # 索然无味  # 这篇  # 开发人员  # 小编  # 服务端  # 大家多多  # 实际应用  # IsValueType  # object  # Copy  # public  # static  # DeepCopyHelper  # Type  # targetDeepCopyObj 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何用y主机助手快速搭建网站?  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  如何在企业微信快速生成手机电脑官网?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  如何续费美橙建站之星域名及服务?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Python数据仓库与ETL构建实战_Airflow调度流程详解  活动邀请函制作网站有哪些,活动邀请函文案?  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  如何用狗爹虚拟主机快速搭建网站?  EditPlus中的正则表达式实战(6)  Laravel怎么在Controller之外的地方验证数据  怎么用AI帮你为初创公司进行市场定位分析?  Android使用GridView实现日历的简单功能  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  *服务器网站为何频现安全漏洞?  Laravel怎么实现模型属性的自动加密  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  如何获取上海专业网站定制建站电话?  如何快速查询域名建站关键信息?  使用C语言编写圣诞表白程序  深圳网站制作的公司有哪些,dido官方网站?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  网站建设保证美观性,需要考虑的几点问题!  Android实现代码画虚线边框背景效果  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  简单实现jsp分页  什么是javascript作用域_全局和局部作用域有什么区别?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  Laravel如何使用Livewire构建动态组件?(入门代码)  如何在阿里云高效完成企业建站全流程?  Laravel如何处理异常和错误?(Handler示例)  Laravel如何实现模型的全局作用域?(Global Scope示例)  iOS中将个别页面强制横屏其他页面竖屏  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  Laravel Docker环境搭建教程_Laravel Sail使用指南  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  如何在局域网内绑定自建网站域名?  bootstrap日历插件datetimepicker使用方法  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  制作企业网站建设方案,怎样建设一个公司网站?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程