C# 使用反射來實現對象的深度復制


實現方式

通過挨個羅列的方式一次復制子對象是非常耗費人力的,如果子對象是引用類型,則還要需要考慮是否對子對象進一步深拷貝。

實際應用中,一個類如果有幾十個子對象,挨個復制對於開發人員來說索然無味比較費時費力。

所以使用反射機制來實現。

 

但是如果是服務端運行的話,還是建議手動的實現。

畢竟反射機制比直接寫出來的效率要慢一些。

 

代碼:

public static class DeepCopyHelper
    {
 
     public static object Copy(this object obj)
     {
         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 member in memberCollection)
             {
                 if (member.MemberType == System.Reflection.MemberTypes.Field)
                 {
                     System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member;
                     Object fieldValue = field.GetValue(obj);
                     if (fieldValue is ICloneable)
                     {
                         field.SetValue(targetDeepCopyObj, (fieldValue as ICloneable).Clone());
                     }
                     else
                     {
                         field.SetValue(targetDeepCopyObj, Copy(fieldValue));
                     }
 
                 }
                 else if (member.MemberType == System.Reflection.MemberTypes.Property)
                 {
                     System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member;
                     MethodInfo info = myProperty.GetSetMethod(false);
                     if (info != null)
                     {
                         object propertyValue = myProperty.GetValue(obj, null);
                         if (propertyValue is ICloneable)
                         {
                             myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null);
                         }
                         else
                         {
                             myProperty.SetValue(targetDeepCopyObj, Copy(propertyValue), null);
                         }
                     }
 
                 }
             }
         }
         return targetDeepCopyObj;
     }
 }

參考:http://www.wxzzz.com/?id=110


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM