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

如何将预初始化的目标对象传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:45:34