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;
}

c# 反射实现模型深拷贝的更多相关文章

  1. 【三】材质反射属性模型BRDF

    双向反射分布函数(BRDF:Bidirecitonal Reflectance Distribution Function) 用来描述物体表面对光的反射性质 预备知识 BRDF的定义和性质 BRDF模 ...

  2. [C#进阶系列]专题一:深入解析深拷贝和浅拷贝

    一.前言 这个星期参加了一个面试,面试中问到深浅拷贝的区别,然后我就简单了讲述了它们的之间的区别,然后面试官又继续问,如何实现一个深拷贝呢?当时只回答回答了一种方式,就是使用反射,然后面试官提示还可以 ...

  3. 一种c#深拷贝方式完胜java深拷贝(实现上的对比)

    楼主是一名asp.net攻城狮,最近经常跑java组客串帮忙开发,所以最近对java的一些基础知识特别上心.却遇到需要将一个对象深拷贝出来做其他事情,而原对象保持原有状态的情况.(实在是不想自己new ...

  4. C#进阶之路(三):深拷贝和浅拷贝

    一.前言 本文主要讨论深浅拷贝的区别,如果实现.浅拷贝日常的应用比较懂,这里不做深入讨论,那么深拷贝如何实现?目前我知道的方式有三种:反射,反序列化和表达树的方式.这里需要注意如果用反射来实现深拷贝的 ...

  5. [MVC]自定义模型绑定器,从表单对模型进行赋值

    一.奇葩的问题 之前自己造轮子的时候,遇到一个很奇怪的问题,虽然需求很奇葩,但是还是尝试解决了一下 当提交的表单里包含多个重复名称的字段的时候,例如 <form action="/Te ...

  6. 斯坦福经典AI课程CS 221官方笔记来了!机器学习模型、贝叶斯网络等重点速查...

    [导读]斯坦福大学的人工智能课程"CS 221"至今仍然是人工智能学习课程的经典之一.为了方便广大不能亲临现场听讲的同学,课程官方推出了课程笔记CheatSheet,涵盖4大类模型 ...

  7. EntityFramework Core如何映射动态模型?

    前言 本文我们来探讨下映射动态模型的几种方式,相信一部分童鞋项目有这样的需求,比如每天/每小时等生成一张表,此种动态模型映射非常常见,经我摸索,这里给出每一步详细思路,希望能帮助到没有任何头绪的童鞋, ...

  8. CSharpGL(20)用unProject和Project实现鼠标拖拽图元

    CSharpGL(20)用unProject和Project实现鼠标拖拽图元 效果图 例如,你可以把Big Dipper这个模型拽成下面这个样子. 配合旋转,还可以继续拖拽成这样. 当然,能拖拽的不只 ...

  9. java-读取javabean类的set方法并设值

    /** * 新反射实例化模型 * @param filenamepath * @return */ public static Object newIntence(String filenamepat ...

随机推荐

  1. 布客&#183;ApacheCN 编程/后端/大数据/人工智能学习资源 2020.9

    公告 ApacheCN 项目的最终目标:五年内备份并翻译 Github 上的所有教程(其实快被我们啃完了,剩下的不多了). 警告各位培训班:对 ApacheCN 宣传文章的举报,也将视为对 Apach ...

  2. JoJoGAN 实践

    JoJoGAN: One Shot Face Stylization. 只用一张人脸图片,就能学习其风格,然后迁移到其他图片.训练时长只用 1~2 min 即可. code paper 效果: 主流程 ...

  3. Idea Error:java: System Java Compiler was not found in classpath:

    前言 这个问题和IDEA的版本有关系,或者有时不小心把项目错误操作了一步,导致出现,这个属于常见错误 解决办法 1:关闭项目,找一个正常运行的项目,将其.idea..mvn文件夹拷贝出来,替换到不能运 ...

  4. Mybatis foreach的用法

    本文援引:https://www.cnblogs.com/fnlingnzb-learner/p/10566452.html 在做mybatis的mapper.xml文件的时候,我们时常用到这样的情况 ...

  5. HDOJ 1249 三角形『平面分隔』

    很水拉   为了记规律- - 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1249 分隔平面公式 下面是我自己查找的公式,没有推到过程,但可以给一些链 ...

  6. python办公自动化系列之金蝶K3自动登录(二)

    接上一篇博文python办公自动化系列之金蝶K3自动登录(一),我们接着聊聊利用python脚本实现金蝶K3 Wise客户端自动登录这一需求. 如上图所示,自动选择[组织机构]后,我们还需要驱动[当前 ...

  7. -bash: ./bin/shutdown.sh: /bin/bash^M: bad interpreter: 没有那个文件或目录

    为什么会出现这种问题: 1.这个问题的原因就是我们放在服务器的脚步类型是dos,而不是unix类型,所以会导致出现(-bash: ./bin/shutdown.sh: /bin/bash^M: bad ...

  8. Spring中@Autowired 注解的注入规则

    默认根据类型,匹配不到则根据bean名字 1.声明一个service接口 public interface HelloService { void sayHello(); } 2.service接口的 ...

  9. P1015 [NOIP1999 普及组] 回文数

    点击查看题目 题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个十进制数 5656,将 5656 加 6565(即把 5656 从右向左读),得到 ...

  10. 《PHP程序员面试笔试宝典》——如何准备集体面试?

    本文摘自<PHP程序员面试笔试宝典>. PHP面试技巧分享,PHP面试题,PHP宝典尽在"琉忆编程库". 集体面试也被称为群面.无领导小组面试.由于计算机发展至今,软件 ...