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

