【原创】C# 深度拷贝对象 使用.NET反射+递归原理实现深度克隆
作者:作者不详  发布日期:2020/03/28 14:47:16
  【原创】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框架网|原创作品.质量保障.竭诚为您服务



上一篇 下一篇