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

如何使用Mapster反向映射时访问目标对象已有值并追加内容

Mapster原生支持映射时访问目标对象的已有值,你预期的逻辑写法只需要补充空值校验、调整为正确的重载用法即可正常运行,具体实现如下:

正确的反向映射配置

首先直接给出可运行的配置代码,已经补充了空值处理,避免新实例映射时空引用异常:

config.NewConfig<ClientDto, Client>()
    .Map(dest => dest.Requirements, (src, dest) => 
    {
        // 兼容目标字段为null的场景(比如映射生成新Client实例的情况)
        var flagList = (dest.Requirements ?? string.Empty)
            .Split(';', StringSplitOptions.RemoveEmptyEntries)
            .ToList();
        const string pkceFlag = "ft:pkce";

        if (src.RequirePkce)
        {
            if (!flagList.Contains(pkceFlag))
            {
                flagList.Add(pkceFlag);
            }
        }
        else
        {
            flagList.Remove(pkceFlag);
        }

        return string.Join(';', flagList);
    });

多标识场景的优化写法

你提到Requirements还有更多同逻辑的标识需要映射,可以把标识切换逻辑封装成通用方法,减少重复代码:

// 通用标识切换方法
private static string ToggleFeatureFlag(string originRequirements, string flag, bool isEnable)
{
    var flagList = (originRequirements ?? string.Empty)
        .Split(';', StringSplitOptions.RemoveEmptyEntries)
        .ToList();
    
    if (isEnable)
    {
        if (!flagList.Contains(flag)) flagList.Add(flag);
    }
    else
    {
        flagList.Remove(flag);
    }

    return string.Join(';', flagList);
}

配置时直接复用方法即可,新增其他标识只需要加一行配置:

config.NewConfig<ClientDto, Client>()
    .Map(dest => dest.Requirements, (src, dest) => ToggleFeatureFlag(dest.Requirements, "ft:pkce", src.RequirePkce))
    // 示例:新增其他标识的映射逻辑
    // .Map(dest => dest.Requirements, (src, dest) => ToggleFeatureFlag(dest.Requirements, "ft:xxx", src.RequireXxx))
    ;

注意事项

如果你的使用场景包含从Dto直接生成新Client实例的情况(调用dto.Adapt<Client>()无参重载),新实例的Requirements初始值为null,上面的代码已经做了兼容处理,不会触发空引用异常。如果需要新实例空状态下返回空字符串而非null,在通用方法的返回处判断即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:24:06