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

Mapster枚举映射问题:MapWith对枚举无效,求解决方案

Mapster枚举映射问题:MapWith失效的原因及替代方案

问题场景

使用Mapster 7.4.0版本,现有BaggageFilter和FlightSearchBaggageFilter两个枚举类型,尝试通过以下代码用MapWith进行映射时失败,但该方法对字符串类型有效:

Expression<Func<BaggageFilter, FlightSearchBaggageFilter>> expression = x => FlightSearchBaggageFilter.Included; 
config.NewConfig<BaggageFilter, FlightSearchBaggageFilter>().MapWith(expression);

是不是Mapster的Bug?

这不是Mapster的Bug。MapWith方法的设计初衷是用于复杂对象之间的自定义属性映射逻辑,它期望表达式能体现源对象到目标对象的关联映射关系。而枚举属于值类型,Mapster对枚举的默认处理逻辑是按整数数值或成员名称进行匹配映射,你的表达式是固定返回一个枚举值,不符合MapWith针对枚举映射的预期场景,因此会失效。

替代实现方式

根据需求不同,可以选择以下几种方案:

1. 固定值映射(无论输入枚举是什么,都返回指定目标枚举值)

使用Map方法直接指定目标值,最贴合你当前代码意图:

config.NewConfig<BaggageFilter, FlightSearchBaggageFilter>()
      .Map(dest => dest, src => FlightSearchBaggageFilter.Included);

2. 按成员名称/数值自动映射

如果两个枚举的成员名称一致或整数数值一致,Mapster默认支持直接映射,无需额外配置:

// 直接调用Adapt即可完成映射
var result = someBaggageFilterInstance.Adapt<FlightSearchBaggageFilter>();

3. 自定义枚举成员对应关系

如果两个枚举的成员名称/数值不匹配,可以通过Map方法逐个指定对应关系:

config.NewConfig<BaggageFilter, FlightSearchBaggageFilter>()
      .Map(dest => dest.Included, src => src.BaggageIncluded)
      .Map(dest => dest.Excluded, src => src.BaggageExcluded);

4. 复杂条件映射

如果需要根据输入枚举的不同值返回不同的目标枚举,可以结合switch表达式实现自定义逻辑:

config.NewConfig<BaggageFilter, FlightSearchBaggageFilter>()
      .Map(dest => dest, src => 
          src switch {
              BaggageFilter.Full => FlightSearchBaggageFilter.Included,
              BaggageFilter.None => FlightSearchBaggageFilter.Excluded,
              _ => FlightSearchBaggageFilter.Unknown
          });

内容的提问来源于stack exchange,提问作者Misho Jikurashvili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 07:07:25