【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆


CSFrameworkCloneExtends扩展类
C# Code:
/// <summary>
/// 对象克隆扩展方法
/// </summary>
public static class CSFrameworkCloneExtends
{
/// <summary>
/// 深度克隆对象列表
/// </summary>
/// <param name="objs"></param>
/// <returns></returns>
public static IList CloneDeeply(this IList objs)
{
ArrayList list = new ArrayList();
foreach (object o in objs)
{
list.Add(CloneDeeply(o));
}
return list;
}
/// <summary>
/// 深度拷贝(使用.NET反射+递归原理实现对象深度克隆)
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static object CloneDeeply(this object obj)
{
object o = System.Activator.CreateInstance(obj.GetType()); //实例化一个T类型对象
PropertyInfo[] propertyInfos = obj.GetType().GetProperties(); //获取T对象的所有公共属性
foreach (PropertyInfo propertyInfo in propertyInfos)
{
object propertyValue = propertyInfo.GetValue(obj, null);
if (propertyValue != null)
{
//判断值是否为空,如果空赋值为null
if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
//如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
NullableConverter nullableConverter = new NullableConverter(propertyInfo.PropertyType);
//将convertsionType转换为nullable对的基础基元类型
propertyInfo.SetValue(o, Convert.ChangeType(propertyInfo.GetValue(obj), nullableConverter.UnderlyingType), null);
}
else
{
//支持克隆
if (propertyValue is ICloneable)
{
//将convertsionType转换为nullable对的基础基元类型
propertyInfo.SetValue(o, Convert.ChangeType((propertyValue as ICloneable).Clone(), propertyInfo.PropertyType), null);
}
else
{
object value;
if (propertyValue is IList) //是列表对象
value = CloneList(propertyValue as IList, propertyInfo.PropertyType);
else
value = propertyValue;
propertyInfo.SetValue(o, value, null);
}
}
}
}
return obj;
}
/// <summary>
/// 克隆对象列表
/// </summary>
/// <param name="list"></param>
/// <param name="listType"></param>
/// <returns></returns>
private static IList CloneList(IList list, Type listType)
{
IList ret = (IList)System.Activator.CreateInstance(listType);
foreach (object obj in list)
{
ret.Add(obj.CloneDeeply());
}
return ret;
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
/// <summary>
/// 对象克隆扩展方法
/// </summary>
public static class CSFrameworkCloneExtends
{
/// <summary>
/// 深度克隆对象列表
/// </summary>
/// <param name="objs"></param>
/// <returns></returns>
public static IList CloneDeeply(this IList objs)
{
ArrayList list = new ArrayList();
foreach (object o in objs)
{
list.Add(CloneDeeply(o));
}
return list;
}
/// <summary>
/// 深度拷贝(使用.NET反射+递归原理实现对象深度克隆)
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static object CloneDeeply(this object obj)
{
object o = System.Activator.CreateInstance(obj.GetType()); //实例化一个T类型对象
PropertyInfo[] propertyInfos = obj.GetType().GetProperties(); //获取T对象的所有公共属性
foreach (PropertyInfo propertyInfo in propertyInfos)
{
object propertyValue = propertyInfo.GetValue(obj, null);
if (propertyValue != null)
{
//判断值是否为空,如果空赋值为null
if (propertyInfo.PropertyType.IsGenericType && propertyInfo.PropertyType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
//如果convertsionType为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
NullableConverter nullableConverter = new NullableConverter(propertyInfo.PropertyType);
//将convertsionType转换为nullable对的基础基元类型
propertyInfo.SetValue(o, Convert.ChangeType(propertyInfo.GetValue(obj), nullableConverter.UnderlyingType), null);
}
else
{
//支持克隆
if (propertyValue is ICloneable)
{
//将convertsionType转换为nullable对的基础基元类型
propertyInfo.SetValue(o, Convert.ChangeType((propertyValue as ICloneable).Clone(), propertyInfo.PropertyType), null);
}
else
{
object value;
if (propertyValue is IList) //是列表对象
value = CloneList(propertyValue as IList, propertyInfo.PropertyType);
else
value = propertyValue;
propertyInfo.SetValue(o, value, null);
}
}
}
}
return obj;
}
/// <summary>
/// 克隆对象列表
/// </summary>
/// <param name="list"></param>
/// <param name="listType"></param>
/// <returns></returns>
private static IList CloneList(IList list, Type listType)
{
IList ret = (IList)System.Activator.CreateInstance(listType);
foreach (object obj in list)
{
ret.Add(obj.CloneDeeply());
}
return ret;
}
}
//来源:C/S框架网 | www.csframework.com | QQ:23404761
测试克隆单个对象(嵌套对象、以及对象列表)
C# Code:
//测试克隆单个对象(嵌套对象、以及对象列表)
DemoData.MySupplierNested supplier = new DemoData.MySupplierNested
{
Code = "S001",
Name = "供应商01",
Tel = "0808-88889999",
CreateTime = DateTime.Now,
Level = 100
};
//构建对象列表实例, List<MySupplier>
supplier.MySuppliers = DemoData.Suppliers;
//构建单个对象实例, Type=MySupplier
supplier.OnSupplier = new DemoData.MySupplier
{
Code = "SXXX",
Name = "供应商XXXX",
Tel = "XXXX-88889999"
};
//深度克隆对象
DemoData.MySupplier clone = (DemoData.MySupplier)supplier.CloneDeeply();
//来源:C/S框架网 | www.csframework.com | QQ:23404761
//测试克隆单个对象(嵌套对象、以及对象列表)
DemoData.MySupplierNested supplier = new DemoData.MySupplierNested
{
Code = "S001",
Name = "供应商01",
Tel = "0808-88889999",
CreateTime = DateTime.Now,
Level = 100
};
//构建对象列表实例, List<MySupplier>
supplier.MySuppliers = DemoData.Suppliers;
//构建单个对象实例, Type=MySupplier
supplier.OnSupplier = new DemoData.MySupplier
{
Code = "SXXX",
Name = "供应商XXXX",
Tel = "XXXX-88889999"
};
//深度克隆对象
DemoData.MySupplier clone = (DemoData.MySupplier)supplier.CloneDeeply();
//来源:C/S框架网 | www.csframework.com | QQ:23404761
测试克隆对象列表
C# Code:
IList suppliers1 = DemoData.Suppliers;
//测试克隆对象列表
IList suppliers2 = suppliers1.CloneDeeply();
//来源:C/S框架网 | www.csframework.com | QQ:23404761
//测试克隆对象列表
IList suppliers2 = suppliers1.CloneDeeply();
//来源:C/S框架网 | www.csframework.com | QQ:23404761


扫一扫加微信


版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网