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
相关产品推荐
相关产品推荐

