程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C# 運用反射來完成對象的深度復制辦法

C# 運用反射來完成對象的深度復制辦法

編輯:關於C++

C# 運用反射來完成對象的深度復制辦法。本站提示廣大學習愛好者:(C# 運用反射來完成對象的深度復制辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是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;
   }
 }

以上這篇C# 運用反射來完成對象的深度復制辦法就是分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved