常规利用反射进行克隆

   public static T CloneModel<T>(T oModel)
{
var oRes = default(T);
var oType = typeof(T); //create new obj
oRes = (T)Activator.CreateInstance(oType); //pass 1 property
var lstPro = oType.GetProperties();
foreach (var oPro in lstPro)
{
var oValue = oPro.GetValue(oModel,null);
oPro.SetValue(oRes, oValue, null);
} var lstField = oType.GetFields();
foreach (var oField in lstField)
{
var oValue = oField.GetValue(oModel);
oField.SetValue(oRes, oValue);
}
return oRes;
}

但是当你克隆的字段中有引用类型的时候并不能真正的拷贝出一个新的如list

因此在SetValue的时候 你需要进行深度拷贝

代码如下可直接使用

public static object DeepCopy(object obj)
{
if (obj == null)
return null;
Type type = obj.GetType(); if (type.IsValueType || type == typeof(string))
{
return obj;
}
else if (type.IsArray)
{
Type elementType = Type.GetType(
type.FullName.Replace("[]", string.Empty));
var array = obj as Array;
Array copied = Array.CreateInstance(elementType, array.Length);
for (int i = 0; i < array.Length; i++)
{
copied.SetValue(DeepCopy(array.GetValue(i)), i);
}
return Convert.ChangeType(copied, obj.GetType());
}
else if (type.IsClass)
{ object toret = Activator.CreateInstance(obj.GetType());
FieldInfo[] fields = type.GetFields(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields)
{
object fieldValue = field.GetValue(obj);
if (fieldValue == null)
continue;
field.SetValue(toret, DeepCopy(fieldValue));
}
return toret;
}
else
throw new ArgumentException("Unknown type");
}

使用的话就是在SetValue时 的oValue进行DeepClone即可

 public static T CloneModel<T>(T oModel)
{
var oRes = default(T);
var oType = typeof(T); //create new obj
oRes = (T)Activator.CreateInstance(oType); //pass 1 property
var lstPro = oType.GetProperties();
foreach (var oPro in lstPro)
{
var oValue = oPro.GetValue(oModel,null);
oPro.SetValue(oRes, DeepCopy(oValue), null);
} var lstField = oType.GetFields();
foreach (var oField in lstField)
{
var oValue = oField.GetValue(oModel);
oField.SetValue(oRes, DeepCopy(oValue));
}
return oRes;
}

这样你就实现了深度拷贝

最新文章

  1. jQuery演示8种不同的图片遮罩层动画效果
  2. Swift (if while)
  3. [Python爬虫]cnblogs博客备份工具(可扩展成并行)
  4. 解决My eclipse 工程发布时端口占用问题
  5. Git版本控制
  6. [backbone] Getting Started with Backbone.js
  7. OI 回忆录
  8. UI篇--Android中3种方法实现back键动作
  9. Visual C++ 6.0静态、动态链接库
  10. AspUpload组件的安装及使用方法介绍
  11. 微信小程序之公共函数引入
  12. Git让你从入门到精通,看这一篇就够了
  13. js几种数组遍历方法.
  14. 三.js实例
  15. python学习笔记(6)--条件分支语句
  16. ASCII到Unicode到UTF-8
  17. 串口发送端verilog代码分析
  18. 论文笔记:Variational Capsules for Image Analysis and Synthesis
  19. java8新特性(四)_Stream详解
  20. 20181105 Timer(慕课网)

热门文章

  1. 曾侯乙编钟引发的遐想之Java设计模式:状态模式
  2. JDBC_11_PreparedStatement(增删改操作)
  3. Day05_23_封装
  4. 基于MATLAB的手写公式识别(4)
  5. Relatives(容斥)
  6. SpringCloud-微服务架构编码构建
  7. sed高级指令
  8. Thinkphp5之Bootstrap自定义BootstrapDetailed分页插件的实现
  9. GIF图片裁剪出指定大小的GIF图片
  10. 【python】Leetcode每日一题-前缀树(Trie)