如何使用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
相关产品推荐
相关产品推荐

