C#Lambda深度拷贝实现

班车上的技术交流有时候比会议室还高效。聊到 C#的深度拷贝,有同事说用Lambda 表达式拷贝对象虽然快,但嵌套对象搞不定。我一听不太信,回到办公室撸了个 Demo,调了几次代码,还真搞定了嵌套的深拷贝。

Lambda 写法简洁,性能也挺不错,尤其是在不想引入外部库的场景下,反射序列化的方式都不如它干净。像这种:

var copier = DeepCopier<;T>;.Create();
var copy = copier(original);

用泛型加表达式树,效率还蛮高,关键是自己能控制细节,不像一些封装好的库黑盒太多。哦对,Expression.MemberInitExpression.Bind这里是重点,别写错了。

如果你遇到对象里嵌套对象、List 嵌套引用对象的情况,可以考虑递归构造表达式树,虽然稍复杂点,但能实现真正的深拷贝。还有,性能瓶颈主要在初始化阶段,构建完 delegate 后用起来快。

你要是对其他语言的拷贝机制也感兴趣,这些文章可以顺便看看:

表达式树+泛型+缓存机制,搞定高性能深拷贝。如果你不想被 JSON 序列化的性能坑,那就试试这招。

rar
LambdaDeepCopy.rar 预估大小:34个文件
folder
LambdaDeepCopy 文件夹
file
Form1.Designer.cs 2KB
file
Program.cs 537B
file
LambdaDeepCopy.cs 5KB
folder
obj 文件夹
folder
Debug 文件夹
file
LambdaDeepCopy.csproj.FileListAbsolute.txt 699B
folder
TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs 文件夹
file
DesignTimeResolveAssemblyReferencesInput.cache 7KB
file
LambdaDeepCopy.pdb 42KB
file
LambdaDeepCopy.exe 15KB
folder
TempPE 文件夹
file
LambdaDeepCopy.Properties.Resources.resources 180B
file
LambdaDeepCopy.csprojResolveAssemblyReference.cache 2KB
file
LambdaDeepCopy.Form1.resources 180B
folder
TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs 文件夹
folder
TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs 文件夹
file
DesignTimeResolveAssemblyReferences.cache 868B
file
LambdaDeepCopy.csproj.GenerateResource.Cache 1012B
folder
bin 文件夹
folder
Debug 文件夹
file
LambdaDeepCopy.vshost.exe 22KB
file
LambdaDeepCopy.pdb 42KB
file
LambdaDeepCopy.exe 15KB
file
LambdaDeepCopy.vshost.exe.config 189B
file
LambdaDeepCopy.exe.config 189B
file
LambdaDeepCopy.vshost.exe.manifest 490B
file
Form1.cs 586B
file
DeepCopySampleSource.cs 365B
file
Form1.resx 6KB
file
DeepCopySampleTarget.cs 363B
file
DeepCopyTest.cs 2KB
file
DeepCopyInner.cs 295B
file
App.config 189B
file
LambdaDeepCopy.csproj 4KB
folder
Properties 文件夹
file
AssemblyInfo.cs 1KB
file
Settings.Designer.cs 1KB
file
Resources.resx 5KB
file
Settings.settings 249B
file
Resources.Designer.cs 3KB
rar 文件大小:56.67KB