如何将预初始化的目标对象传入AutoMapper的ForAllMembers方法?
解决AutoMapper保留已初始化目标属性的问题
你现在的问题核心是没有把预先初始化的目标对象传入Map方法,默认的Map<User>(model)会让AutoMapper新建一个User实例,自然拿不到你之前初始化的属性值。另外需要在配置里添加条件,让AutoMapper跳过已有值的属性映射。
步骤1:修改映射调用代码
先初始化你的User对象,再用带两个参数的Map重载,把已初始化的对象传进去:
// 先初始化目标对象,设置你想保留的属性 var user = new User { Id = 123, // 比如这个属性你想保留,不让AutoMapper覆盖 Nickname = "老用户" }; // 调用带两个参数的Map方法:源对象 -> 已存在的目标对象 _mapper.Map(model, user);
步骤2:修改AutoMapperProfile配置
在ForAllMembers的Condition里,增加判断:如果目标属性已经有非默认值,就跳过映射,保留原有值。同时保留你原来的Blah属性判断逻辑:
using AutoMapper; using coreapi.requests; namespace WebApi.Helpers { public class AutoMapperProfile : Profile { public AutoMapperProfile() { CreateMap<UserRequest, User>() .ForMember(dst => dst.Blah, o => o.MapFrom(src => src.Test)) .ForAllMembers(x => x.Condition( (src, dest, prop, context) => { // 优先判断:如果目标属性已有非默认值,跳过映射 if (dest != null && !Equals(prop, context.Mapper.ConfigurationProvider.GetDefaultValue(dest.GetType()))) { return false; } // 你原来的Blah属性判断逻辑 if (x.DestinationMember.Name == "Blah" && src.Test == null) { return false; } return true; } )); } } }
关键说明
- 带两个参数的
Map(source, destination)是AutoMapper的更新模式,会直接修改传入的destination对象,而不是新建。 context.Mapper.ConfigurationProvider.GetDefaultValue(dest.GetType())用来获取属性的默认值(比如int是0,string是null),判断目标属性是否是你手动设置的非默认值。- 如果你的属性是引用类型(比如自定义对象),可能需要调整默认值判断逻辑,确保能正确识别你是否初始化过。
内容的提问来源于stack exchange,提问作者janci
相关产品推荐
相关产品推荐

