C# 使用反射来实现对象的深度复制方法

作者:袖梨 2022-06-25

实现方式

通过挨个罗列的方式一次复制子对象是非常耗费人力的,如果子对象是引用类型,则还要需要考虑是否对子对象进一步深拷贝。

实际应用中,一个类如果有几十个子对象,挨个复制对于开发人员来说索然无味比较费时费力。

所以使用反射机制来实现。
但是如果是服务端运行的话,还是建议手动的实现。

毕竟反射机制比直接写出来的效率要慢一些。

代码:

 

 代码如下复制代码

publicstaticclassDeepCopyHelper

  {

  

   publicstaticobjectCopy(thisobjectobj)

   {

     Object targetDeepCopyObj;

     Type targetType = obj.GetType();

     //值类型

     if(targetType.IsValueType ==true)

     {

       targetDeepCopyObj = obj;

     }

     //引用类型

     else

     {

       targetDeepCopyObj = System.Activator.CreateInstance(targetType); //创建引用对象

       System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers();

  

       foreach(System.Reflection.MemberInfo memberinmemberCollection)

       {

         if(member.MemberType == System.Reflection.MemberTypes.Field)

         {

           System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member;

           Object fieldValue = field.GetValue(obj);

           if(fieldValueisICloneable)

           {

             field.SetValue(targetDeepCopyObj, (fieldValueasICloneable).Clone());

           }

           else

           {

             field.SetValue(targetDeepCopyObj, Copy(fieldValue));

           }

  

         }

         elseif(member.MemberType == System.Reflection.MemberTypes.Property)

         {

           System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member;

           MethodInfo info = myProperty.GetSetMethod(false);

           if(info !=null)

           {

             objectpropertyValue = myProperty.GetValue(obj,null);

             if(propertyValueisICloneable)

             {

               myProperty.SetValue(targetDeepCopyObj, (propertyValueasICloneable).Clone(),null);

             }

             else

             {

               myProperty.SetValue(targetDeepCopyObj, Copy(propertyValue),null);

             }

           }

  

         }

       }

     }

     returntargetDeepCopyObj;

   }

 }

 

相关文章

精彩推荐