欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 使用反射來(lái)實(shí)現(xiàn)對(duì)象的深度復(fù)制方法

 更新時(shí)間:2017年01月18日 11:12:10   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇C# 使用反射來(lái)實(shí)現(xiàn)對(duì)象的深度復(fù)制方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

實(shí)現(xiàn)方式

通過(guò)挨個(gè)羅列的方式一次復(fù)制子對(duì)象是非常耗費(fèi)人力的,如果子對(duì)象是引用類型,則還要需要考慮是否對(duì)子對(duì)象進(jìn)一步深拷貝。

實(shí)際應(yīng)用中,一個(gè)類如果有幾十個(gè)子對(duì)象,挨個(gè)復(fù)制對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)索然無(wú)味比較費(fèi)時(shí)費(fèi)力。

所以使用反射機(jī)制來(lái)實(shí)現(xiàn)。
 
但是如果是服務(wù)端運(yùn)行的話,還是建議手動(dòng)的實(shí)現(xiàn)。

畢竟反射機(jī)制比直接寫出來(lái)的效率要慢一些。

代碼:

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)建引用對(duì)象 
       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# 使用反射來(lái)實(shí)現(xiàn)對(duì)象的深度復(fù)制方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)雙向鏈表

    C語(yǔ)言實(shí)現(xiàn)雙向鏈表

    本文給大家分享的是一段使用C語(yǔ)言實(shí)現(xiàn)雙向鏈表的代碼,完全是根據(jù)自己的理解和認(rèn)識(shí)來(lái)編寫的,希望大家能夠喜歡,文章的最后附上了一個(gè)網(wǎng)友寫的對(duì)于雙向鏈表刪除節(jié)點(diǎn)、插入節(jié)點(diǎn)、雙向輸出等操作的代碼,也非常不錯(cuò),推薦給大家
    2015-03-03
  • C語(yǔ)言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例

    C語(yǔ)言中隊(duì)列的結(jié)構(gòu)和函數(shù)接口的使用示例

    隊(duì)列只允許一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIFO的性質(zhì);隊(duì)列可用數(shù)組和鏈表 的方法實(shí)現(xiàn),使用鏈表的結(jié)構(gòu)實(shí)現(xiàn)更優(yōu)一些,因?yàn)槿绻褂脭?shù)組節(jié),出隊(duì)列時(shí)刪去首元素需要將整個(gè)數(shù)組前移,效率比較低
    2023-02-02
  • C++二分查找算法實(shí)例

    C++二分查找算法實(shí)例

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

    C程序和C++程序之間的互相調(diào)用圖文教程

    這篇文章主要給大家介紹了關(guān)于C程序和C++程序之間互相調(diào)用的相關(guān)資料,我們平常在刷題的時(shí)候,難免遇到實(shí)現(xiàn)多組輸入這樣的問(wèn)題,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之 折半查找實(shí)例詳解

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之 折半查找實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之 折半查找實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++實(shí)現(xiàn)順序表的方法

    C++實(shí)現(xiàn)順序表的方法

    本文給大家?guī)?lái)了C++實(shí)現(xiàn)順序表的方法,代碼簡(jiǎn)單易懂,附有注釋,感興趣的朋友一起看下吧
    2016-08-08
  • C語(yǔ)言零基礎(chǔ)徹底掌握預(yù)處理上篇

    C語(yǔ)言零基礎(chǔ)徹底掌握預(yù)處理上篇

    在C語(yǔ)言的程序中包括各種以符號(hào)#開(kāi)頭的編譯指令,這些指令稱為預(yù)處理命令。預(yù)處理命令屬于C語(yǔ)言編譯器,而不是C語(yǔ)言的組成部分,通過(guò)預(yù)處理命令可擴(kuò)展C語(yǔ)言程序設(shè)計(jì)的環(huán)境
    2022-08-08
  • C++實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)

    C++實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)

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

    C/C++中指針和引用之相關(guān)問(wèn)題深入研究

    從內(nèi)存分配上看,程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域,而不為引用分配內(nèi)存區(qū)域,因?yàn)橐寐暶鲿r(shí)必須初始化,從而指向一個(gè)已經(jīng)存在的對(duì)象。引用不能指向空值
    2013-10-10
  • 如何利用tinyxml操縱xml及注意問(wèn)題

    如何利用tinyxml操縱xml及注意問(wèn)題

    這篇博客,我們?cè)敿?xì)講述如何利用tinyxml操縱xml。以及在操作的過(guò)程中,我們應(yīng)該注意的問(wèn)題
    2013-01-01

最新評(píng)論