c#用表達(dá)式樹實現(xiàn)深拷貝功能
????因為對表達(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)類) HashSetbooks = new HashSet () { book, book }; HashSetbooks2 = 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ù)如下:

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

測試內(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();

// 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();

?
// 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)一下在看圖片
小微工資漲1毛
商務(wù)合作QQ:185601686
