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

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

【原创】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



测试克隆单个对象(嵌套对象、以及对象列表)


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



测试克隆对象列表


C# Code:

IList suppliers1 = DemoData.Suppliers;

//测试克隆对象列表
IList suppliers2 = suppliers1.CloneDeeply();

//来源:C/S框架网 | www.csframework.com | QQ:23404761



贴图图片-递归原理实现深度克隆拷贝对象


C/S框架网|原创精神.创造价值.打造精品

扫一扫加微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务



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

评论内容
昵称:
关联文章

C# 深度拷贝对象 使用.NET反射+原理实现深度克隆
[]读取DataTable加载TreeList控件
C#中实现对象的深拷贝(Deep Copy)
C# 实现对象拷贝Copy(极速复制对象)
C# 克隆对象、复制对象(浅拷贝)、复制对象相同属性的值
使用获取TreeList中所有勾选的结点
】WebApi开发框架:Token生成、Token缓存原理、Token验证、令牌机制与原理
WebApi接口使用HttpGet方式实现接受实体类参数()
C#.Net局域网版本自动升级解决方案()
C#.Net反射(Reflaction)技术实例详解
[]无线监控系统之二-------C#实现(续)
C#.Net B/S简单框架结构示例[]
[] 使用Tcp/Ip下载文件(图)
.Net后端框架|WebApi服务端开发框架|C/S框架网作品
NET开发框架,基于ADO.NET数据持久化快速开发框架平台-C/S框架网产品
SQL获取当前类别及所有子类别,用于按类型查询
C/S架构开源软件 - C#.NET+Winform+Dev+SQL快速开发框架
.NET快速开发框架|C/S框架网
C# 阿里云ECS服务器SMTP发送邮件使用80端口 -
C#.Net组件开发 - 设计时使用自定义属性编辑器持久化对象