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;
}
c# 反射实现模型深拷贝的更多相关文章
- 【三】材质反射属性模型BRDF
双向反射分布函数(BRDF:Bidirecitonal Reflectance Distribution Function) 用来描述物体表面对光的反射性质 预备知识 BRDF的定义和性质 BRDF模 ...
- [C#进阶系列]专题一:深入解析深拷贝和浅拷贝
一.前言 这个星期参加了一个面试,面试中问到深浅拷贝的区别,然后我就简单了讲述了它们的之间的区别,然后面试官又继续问,如何实现一个深拷贝呢?当时只回答回答了一种方式,就是使用反射,然后面试官提示还可以 ...
- 一种c#深拷贝方式完胜java深拷贝(实现上的对比)
楼主是一名asp.net攻城狮,最近经常跑java组客串帮忙开发,所以最近对java的一些基础知识特别上心.却遇到需要将一个对象深拷贝出来做其他事情,而原对象保持原有状态的情况.(实在是不想自己new ...
- C#进阶之路(三):深拷贝和浅拷贝
一.前言 本文主要讨论深浅拷贝的区别,如果实现.浅拷贝日常的应用比较懂,这里不做深入讨论,那么深拷贝如何实现?目前我知道的方式有三种:反射,反序列化和表达树的方式.这里需要注意如果用反射来实现深拷贝的 ...
- [MVC]自定义模型绑定器,从表单对模型进行赋值
一.奇葩的问题 之前自己造轮子的时候,遇到一个很奇怪的问题,虽然需求很奇葩,但是还是尝试解决了一下 当提交的表单里包含多个重复名称的字段的时候,例如 <form action="/Te ...
- 斯坦福经典AI课程CS 221官方笔记来了!机器学习模型、贝叶斯网络等重点速查...
[导读]斯坦福大学的人工智能课程"CS 221"至今仍然是人工智能学习课程的经典之一.为了方便广大不能亲临现场听讲的同学,课程官方推出了课程笔记CheatSheet,涵盖4大类模型 ...
- EntityFramework Core如何映射动态模型?
前言 本文我们来探讨下映射动态模型的几种方式,相信一部分童鞋项目有这样的需求,比如每天/每小时等生成一张表,此种动态模型映射非常常见,经我摸索,这里给出每一步详细思路,希望能帮助到没有任何头绪的童鞋, ...
- CSharpGL(20)用unProject和Project实现鼠标拖拽图元
CSharpGL(20)用unProject和Project实现鼠标拖拽图元 效果图 例如,你可以把Big Dipper这个模型拽成下面这个样子. 配合旋转,还可以继续拖拽成这样. 当然,能拖拽的不只 ...
- java-读取javabean类的set方法并设值
/** * 新反射实例化模型 * @param filenamepath * @return */ public static Object newIntence(String filenamepat ...
随机推荐
- 使用 Frp 和 Docker 通过远程桌面和 SSH 来远程控制 Windows(反向代理)
最新博客文章链接 大体思路 使用 Docker 容器,在云服务器上部署 Frps 容器来中转流量,在被控制的 Windows 上部署 Frpc 容器来暴露内网的服务,在主控制端的 Windows 上直 ...
- HTML图片轮播
一.纯 CSS 实现图片轮播 引自原文作者:南张人 原文链接:https://blog.csdn.net/u011848617/article/details/80468463 理论基础 CSS3 a ...
- CentOS下搭建自动化测试基础框架:Jenkins+Maven+TestNG+ReportNG
1. 安装JDK 1.1 卸载系统默认已安装的open-jdk rpm -qa|grep java 查出来openjdk相关的应用,把查出来的所有都要通过下面的命令给卸载掉 rpm -e --node ...
- Keras学习:试用卷积-训练CIFAR-10数据集
import numpy as np import cPickle import keras as ks from keras.layers import Dense, Activation, Fla ...
- Dump Lsass内存转储新旧方法
之前看到一篇关于Lsass内存dump的文章,学习记录一下. lsass.exe(Local Security Authority Subsystem Service)进程空间中,存有着机器的 ...
- JVM学习——字节码(学习过程)
JVM--字节码 为什么要学字节码 字节码文件,有什么用? JVM虚拟机的特点:一处编译,多处运行. 多处运行,靠的是.class 字节码文件. JVM本身,并不是跨平台的.Java之所以跨平台,是因 ...
- Mybatis获取自增主键的两种方式
<insert id="saveOne" parameterType="com.buwei.entity.User" > INSERT into u ...
- 【论文考古】分布式优化 Communication Complexity of Convex Optimization
J. N. Tsitsiklis and Z.-Q. Luo, "Communication complexity of convex optimization," Journal ...
- [系统优化]Centos系统优化
在运维工作中,我们发现Linux系统安装之后并不能立即投入生产环境使用,往往需要先经过我们运维人员的优化才行.以下是我在日常生产应用的优化操作. 一.文件打开数限制优化 描述 生产下要调整 ...
- k8s管理平台:rancher
简介 中文官网:https://docs.rancher.cn/ github:https://github.com/rancher/rancher 基础环境 https://www.cnblogs. ...