今天來給大家講講如何用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、總結
從以上的測試和分析可以很容易得出, 用運算式樹+泛型是最優的解決方案, 比傳統的序列化反序列化和反射更加優秀, 甚至還能超越一些成熟工具的性能。 同時感慨一下, 精益求精, 進無止境。