<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          c#用表達(dá)式樹實現(xiàn)深拷貝功能

          共 3627字,需瀏覽 8分鐘

           ·

          2022-01-27 08:29

          ????因為對表達(dá)式樹有點(diǎn)興趣,出于練手的目的,試著寫了一個深拷貝的工具庫。支持.net standard2.0或.net framework4.5及以上。

          GitHub地址https://github.com/blurhkh/DeepCopier

          nuget地址https://www.nuget.org/packages/DeepCopier

          使用方法如下:

          首先創(chuàng)建幾個測試用的類型

             public class Author    {        public string Name { get; set; }    }
          public class Book { public string Title { get; set; } public Author Author { get; set; } public List<string> Tags { get; set; } }
          public class BookDTO { public string Title { get; set; } public Author Author { get; set; } public List<string> Tags { get; set; } }??? Book book = new Book { Author = new Author { Name = "Author" }, Title = "Title", Tags = new List<string> { "dotnet-core", "c#" } };
          // 用法1 深拷貝一個對象 Book book2 = Copier.Copy(book); // 或一個IEnumerable的實現(xiàn)類實例(目前僅支持一維數(shù)組和ICollection的實現(xiàn)類) HashSet books = new HashSet() { book, book }; HashSet books2 = Copier.Copy(books);
          // 用法2 新建目標(biāo)類型實例,并將源對象的屬性值拷貝至目標(biāo)對象的對應(yīng)屬性 BookDTO bookDTO = Copier.Copy(book);
          // 用法3 將源對象的屬性值拷貝至已存在的目標(biāo)對象的對應(yīng)屬性 BookDTO target = new BookDTO(); Copier.Copy(book, target);

          同類的工具庫比如較為常見的AutoMapper和一個Reflection.Emit操作IL寫的DeepCopy(https://www.nuget.org/packages/DeepCopy/)

          接下來進(jìn)行一下和他們的性能對比,測試數(shù)據(jù)采用上面的Book類型,循環(huán)次數(shù)為100萬次。

          測試數(shù)據(jù)如下:

          fba8fb97b4b7b56d93b3d53d527d5612.webp

                  Book book = new Book
          {
          Author
          = new Author { Name = "Author" },
          Title
          = "Title",
          Tags
          = new List<string> { "dotnet-core", "c#" }
          };

          fba8fb97b4b7b56d93b3d53d527d5612.webp

          測試內(nèi)容如下(本人PC的CPU為I7 4790k,不同庫的測試代碼分別跑在不同的程序里):

          首先和AutoMapper進(jìn)行對比

          BookDTO bookDTO = null;Stopwatch sw = new Stopwatch();sw.Start();for (int i = 0; i < 1000000; i++){    bookDTO = DeepCopier.Copier.Copy(book);}Console.WriteLine($"DeepCopier costed {sw.ElapsedMilliseconds} ms at 1st time.");sw.Restart();for (int i = 0; i < 1000000; i++){    bookDTO = DeepCopier.Copier.Copy(book);}// 因為有了前一次的緩存,這里速度會更快Console.WriteLine($"DeepCopier costed {sw.ElapsedMilliseconds} ms at 2nd time.");Console.ReadLine();

            92a14d064e4893552b229fdd0ad827c1.webp


                   // AutoMapper需要提前配置            AutoMapper.Mapper.Initialize(config => {                config.CreateMap();            });
          BookDTO bookDTO = null;
          Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 1000000; i++) { bookDTO = AutoMapper.Mapper.Map(book); } Console.WriteLine($"AutoMapper costed {sw.ElapsedMilliseconds} ms at 1st time.");
          sw.Restart();
          for (int i = 0; i < 1000000; i++) { bookDTO = AutoMapper.Mapper.Map(book); } Console.WriteLine($"AutoMapper costed {sw.ElapsedMilliseconds} ms at 2nd time."); Console.ReadLine();

          d42b2be20778a2bb7b91866b7b97ea32.webp

          ?


          // DeepCopy只支持對自身類型的拷貝 Book temp = null;
          Stopwatch sw = new Stopwatch(); sw.Start(); for (int i = 0; i < 1000000; i++) { temp = DeepCopy.DeepCopier.Copy(book); } Console.WriteLine($"DeepCopy costed {sw.ElapsedMilliseconds} ms at 1st time.");
          sw.Restart();
          for (int i = 0; i < 1000000; i++) { temp = DeepCopy.DeepCopier.Copy(book); } Console.WriteLine($"DeepCopy costed {sw.ElapsedMilliseconds} ms at 2nd time."); Console.ReadLine();

          出處:https://www.cnblogs.com/eventhorizon/p/8728866.html

          版權(quán)申明:本文來源于網(wǎng)友收集或網(wǎng)友提供,僅供學(xué)習(xí)交流之用,如果有侵權(quán),請轉(zhuǎn)告版主或者留言,本公眾號立即刪除。


          支持小微:

          騰訊云 雙十二活動!玩服務(wù)器的可以搞搞,老客戶也可以參加!

          輕量服務(wù)器??2核4G8M80G?222元/3年??

          爆款1核2G云服務(wù)器首年50元??

          鏈接:https://curl.qcloud.com/bR8ycXZa


          右下角,您點(diǎn)一下在看圖片1fb202e51788b431fb9867aea6e035bf.webp

          小微工資漲1毛

          商務(wù)合作QQ:185601686



          瀏覽 83
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲a免费观看 | 国产av佳作老友重逢 相干恨晚 | 婷婷五月丁香激情 | 五月天av在线 | 五月婷婷丁香在线观看视频麻豆 |