You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用AutoMapper实现对象深拷贝?解决浅拷贝问题

用AutoMapper实现同类型对象的深拷贝

AutoMapper默认对引用类型属性采用浅拷贝,但可以通过以下两种方式实现深拷贝,同时适配当前版本的AutoMapper(已移除旧版静态Mapper.Map方法):

1. 配置映射规则时启用递归深拷贝

在你的AutoMapper Profile配置类中,显式配置TrainingSetDto到自身的映射,让AutoMapper递归处理所有引用类型属性:

public class TrainingSetProfile : Profile
{
    public TrainingSetProfile()
    {
        CreateMap<TrainingSetDto, TrainingSetDto>()
            // 可选:确保只映射非空属性,根据实际需求调整
            .ForAllMembers(opt => opt.Condition((src, dest, srcVal) => srcVal != null))
            // 对所有成员执行深拷贝映射
            .ForAllOtherMembers(opt => opt.MapFrom(src => src));
    }
}

配置完成后,调用_mapper.Map<TrainingSetDto>(original)就会生成完全独立的新实例,所有引用类型属性都会被递归复制。

2. 调用Map方法时传入null作为目标对象

如果只是临时需要深拷贝,无需修改全局配置,可以在调用Map时,将第二个参数设为null,强制AutoMapper创建全新的目标实例:

var original = new TrainingSetDto();
// 传入null让AutoMapper生成新实例,而非复用源引用
var output = _mapper.Map<TrainingSetDto>(original, null);

这种方式的核心是告诉AutoMapper:不需要更新已有对象,必须创建一个全新的目标对象,从而触发深拷贝逻辑。

关于旧版静态Mapper方法

你提到的Mapper.Map<Person>(originalPerson)这类静态方法在AutoMapper 9.0及以后的版本中已被废弃,当前官方推荐通过依赖注入获取IMapper实例(即你代码中的_mapper)来使用,这也是符合现代.NET开发的最佳实践。

内容的提问来源于stack exchange,提问作者Kebechet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:01:19