亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2017年01月18日 11:12:10   投稿:jingxian  
下面小編就為大家?guī)硪黄狢# 使用反射來實現對象的深度復制方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

實現方式

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

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

所以使用反射機制來實現。
 
但是如果是服務端運行的話,還是建議手動的實現。

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

代碼:

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);  //創(chuàng)建引用對象 
       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# 使用反射來實現對象的深度復制方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • C語言實現雙向鏈表

    C語言實現雙向鏈表

    本文給大家分享的是一段使用C語言實現雙向鏈表的代碼,完全是根據自己的理解和認識來編寫的,希望大家能夠喜歡,文章的最后附上了一個網友寫的對于雙向鏈表刪除節(jié)點、插入節(jié)點、雙向輸出等操作的代碼,也非常不錯,推薦給大家
    2015-03-03
  • C語言中隊列的結構和函數接口的使用示例

    C語言中隊列的結構和函數接口的使用示例

    隊列只允許一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出FIFO的性質;隊列可用數組和鏈表 的方法實現,使用鏈表的結構實現更優(yōu)一些,因為如果使用數組節(jié),出隊列時刪去首元素需要將整個數組前移,效率比較低
    2023-02-02
  • C++二分查找算法實例

    C++二分查找算法實例

    這篇文章主要為大家詳細介紹了C++二分查找算法的實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C程序和C++程序之間的互相調用圖文教程

    C程序和C++程序之間的互相調用圖文教程

    這篇文章主要給大家介紹了關于C程序和C++程序之間互相調用的相關資料,我們平常在刷題的時候,難免遇到實現多組輸入這樣的問題,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • C語言數據結構之 折半查找實例詳解

    C語言數據結構之 折半查找實例詳解

    這篇文章主要介紹了C語言數據結構之 折半查找實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • C++實現順序表的方法

    C++實現順序表的方法

    本文給大家?guī)砹薈++實現順序表的方法,代碼簡單易懂,附有注釋,感興趣的朋友一起看下吧
    2016-08-08
  • C語言零基礎徹底掌握預處理上篇

    C語言零基礎徹底掌握預處理上篇

    在C語言的程序中包括各種以符號#開頭的編譯指令,這些指令稱為預處理命令。預處理命令屬于C語言編譯器,而不是C語言的組成部分,通過預處理命令可擴展C語言程序設計的環(huán)境
    2022-08-08
  • C++實現停車場管理系統(tǒng)

    C++實現停車場管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現停車場管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C/C++中指針和引用之相關問題深入研究

    C/C++中指針和引用之相關問題深入研究

    從內存分配上看,程序為指針變量分配內存區(qū)域,而不為引用分配內存區(qū)域,因為引用聲明時必須初始化,從而指向一個已經存在的對象。引用不能指向空值
    2013-10-10
  • 如何利用tinyxml操縱xml及注意問題

    如何利用tinyxml操縱xml及注意問題

    這篇博客,我們詳細講述如何利用tinyxml操縱xml。以及在操作的過程中,我們應該注意的問題
    2013-01-01

最新評論