C# DeepClone 深拷贝
2024-09-08 03:47:50
常规利用反射进行克隆
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;
}
这样你就实现了深度拷贝
最新文章
- jQuery演示8种不同的图片遮罩层动画效果
- Swift (if while)
- [Python爬虫]cnblogs博客备份工具(可扩展成并行)
- 解决My eclipse 工程发布时端口占用问题
- Git版本控制
- [backbone] Getting Started with Backbone.js
- OI 回忆录
- UI篇--Android中3种方法实现back键动作
- Visual C++ 6.0静态、动态链接库
- AspUpload组件的安装及使用方法介绍
- 微信小程序之公共函数引入
- Git让你从入门到精通,看这一篇就够了
- js几种数组遍历方法.
- 三.js实例
- python学习笔记(6)--条件分支语句
- ASCII到Unicode到UTF-8
- 串口发送端verilog代码分析
- 论文笔记:Variational Capsules for Image Analysis and Synthesis
- java8新特性(四)_Stream详解
- 20181105 Timer(慕课网)