您的位置:首頁>正文

高級架構師教你如何用C 快速高效複製物件,這招絕了!

今天來給大家講講如何用C# 快速高效複製物件, 乾貨多多, 不要錯過哦!

廢話不多說直接上乾貨。

1、需求

在代碼中經常會遇到需要把物件A轉換成物件B, 二者屬性一致(不一致可以增加映射規則)。

2、解決方案

2.1、硬編碼

直接硬編碼寫死轉換, 速度肯定最快, 但是完全沒有通用性, 只能處理單一情況。

調用一百萬次耗時:26毫秒

2.2、反射

反射應該是很多人用過的方法, 就是封裝一個方法, 反射獲取屬性值, 然後設置給目標物件。

調用一百萬次耗時:2464毫秒

2.3、序列化反序列化

序列化的方式有很多種, 有二進位、xml、json等等, 今天我們就用Newtonsoft的json進行測試, 序列化後再反序列化, 調用一百萬次耗時:2984毫秒

從這可以看出序列化和反射效率差別不大。

2.4、運算式樹緩存

既然上面用了反射性能都不理想, 反而是硬編碼效率最高, 那我們不如想想辦法通過硬編碼的方式來轉換, 但是這個硬編碼是通過別的方式生成了, 這就是運算式樹。

調用一百萬次耗時:564毫秒

2.5、運算式樹+泛型變數

上面使用了靜態字典來保存委託, 100w次的調用大部分時間都用來字典查找和類型轉換了, 下面用泛型類靜態變數的封閉特性進行優化:

調用一百萬次耗時:107毫秒

2.5、automapper

還有種方式是使用automapper工具, 原理也是生成硬編碼, 只不過是通過emit完成的, 調用一百萬次是338毫秒

4、總結

從以上的測試和分析可以很容易得出, 用運算式樹+泛型是最優的解決方案, 比傳統的序列化反序列化和反射更加優秀, 甚至還能超越一些成熟工具的性能。 同時感慨一下, 精益求精, 進無止境。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示