当前位置: 首页 > news >正文

c# 反射实现模型深拷贝

1.支持属性,不支持字段,支持复杂类型属性

2.泛型集合类支持List<T>与Dictionary<TKey,TValue>

3.如果发现有什么问题,希望大家可以多多指教

     /// <summary>
        /// 模型深拷贝
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static object Clone(this object model)
        {
            var modelType = model.GetType();
            if (modelType.IsValueType)
            {
                return model;
            }
            if (modelType.Name == typeof(List<>).Name)
            {
                var genericType = modelType.GenericTypeArguments;
                var newObj = Activator.CreateInstance(genericType.FirstOrDefault());
                var newList = (IList)Activator.CreateInstance(modelType);
                foreach (var itemObj in (IList)model)
                {
                    newList.Add(itemObj.Clone());
                }
                return newList;
            }
            if (modelType.Name == typeof(Dictionary<,>).Name)
            {
                var genericType = modelType.GenericTypeArguments;
                var newkey = Activator.CreateInstance(genericType[0]);
                var newValue = Activator.CreateInstance(genericType[1]);
                var newDic = (IDictionary)Activator.CreateInstance(modelType);
                var modelDic = (IDictionary)model;
                foreach (var itemkey in (modelDic.Keys))
                {
                    newDic.Add(itemkey.Clone(), modelDic[itemkey].Clone());

                }
                return newDic;
            }
            var pros = modelType.GetProperties();
            var newModel = Activator.CreateInstance(modelType, true);
            var newModelType = newModel.GetType();
            var newpros = newModelType.GetProperties();
            foreach (var pro in pros)
            {
                var newPro = newpros.FirstOrDefault(u => u.Name == pro.Name);
                if (pro.PropertyType.IsValueType || pro.PropertyType == typeof(string))
                {
                    var value = pro.GetValue(model);
                    newPro.SetValue(newModel, value);
                }
                else
                {
                    var value = pro.GetValue(model);
                    var actobj = Activator.CreateInstance(newPro.PropertyType, true);
                    newPro.SetValue(newModel, value.Clone());
                }
            }
            return newModel;
        }

 

转载于:https://www.cnblogs.com/yijiayi/p/9695626.html

相关文章:

  • 迅速上手:使用taro构建微信小程序基础教程
  • 第二次做HDOJ 1051
  • Python学习-第2课(函数,函数文档)
  • P2245 星际导航
  • 漫步Java------初识java
  • Web负载均衡
  • 关于VSCode自动缩进/格式化复制粘贴的代码
  • 深入浅出的webpack4构建工具---比mock模拟数据更简单的方式(二十一)
  • Vulnhub Breach1.0
  • Python配置处理ini文件-configparser
  • Children's Game UVA - 10905
  • 搭建ssh框架项目(三)
  • 汇编实验二
  • vant ui 在vue中的安装和使用
  • mongo源码学习(四)服务入口点ServiceEntryPoint
  • ES6指北【2】—— 箭头函数
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Android系统模拟器绘制实现概述
  • Android优雅地处理按钮重复点击
  • Asm.js的简单介绍
  • avalon2.2的VM生成过程
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Python学习之路16-使用API
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • Vue2.x学习三:事件处理生命周期钩子
  • webpack项目中使用grunt监听文件变动自动打包编译
  • Windows Containers 大冒险: 容器网络
  • 从零搭建Koa2 Server
  • 近期前端发展计划
  • 力扣(LeetCode)56
  • 聊聊flink的BlobWriter
  • 模型微调
  • 前端路由实现-history
  • 如何胜任知名企业的商业数据分析师?
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • #Linux(Source Insight安装及工程建立)
  • #Ubuntu(修改root信息)
  • (06)金属布线——为半导体注入生命的连接
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (C++17) std算法之执行策略 execution
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (七)理解angular中的module和injector,即依赖注入
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (一)基于IDEA的JAVA基础10
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)Unity3DUnity3D在android下调试
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • @AutoConfigurationPackage的使用