AutoMapper成员级值转换未应用到目标属性的问题咨询
AutoMapper string转decimal后执行缩放处理方案
你遇到的转换器不生效问题,核心是AutoMapper的AddTransform方法在源与目标属性类型不一致时,如果没有显式指定转换后的目标类型,无法正确触发后续的缩放四舍五入逻辑。你希望复用AutoMapper内置的string到decimal映射约定的需求可通过以下两种方案实现:
方案1:显式指定AddTransform泛型参数(最简方案)
直接在原有代码基础上给AddTransform显式声明输入类型为decimal,即可确保在AutoMapper完成内置的string转decimal逻辑后,执行你定义的缩放处理:
CreateMap<Source, Target>() .ForMember(dest => dest.Rate, opts => { opts.MapFrom(src => src.Rate); // 显式指定转换输入为decimal类型,匹配目标属性类型 opts.AddTransform<decimal>(x => Math.Round(x * 100M, 2)); });
该方案无需额外定义类,代码可读性高,且完全复用AutoMapper内置的类型转换逻辑,覆盖空字符串、null值、不同数字格式等边界场景。
方案2:自定义可复用值转换器(适合多场景复用)
如果多个属性都需要同样的string转decimal后缩放的逻辑,可以定义通用的IValueConverter实现,实现逻辑复用:
- 定义转换器类
public class ScaledDecimalConverter : IValueConverter<string, decimal> { private readonly decimal _scale; private readonly int _decimals; public ScaledDecimalConverter(decimal scale, int decimals) { _scale = scale; _decimals = decimals; } public decimal Convert(string source, ResolutionContext context) { // 调用AutoMapper内置转换逻辑,无需自己实现字符串转decimal var rawValue = context.Mapper.Map<decimal>(source); return Math.Round(rawValue * _scale, _decimals); } }
- 映射配置中使用
CreateMap<Source, Target>() .ForMember(dest => dest.Rate, opts => opts.ConvertUsing(new ScaledDecimalConverter(100M, 2), src => src.Rate));
该方案适合多属性复用同一种转换规则的场景,维护成本更低。
内容的提问来源于stack exchange,提问作者Brian Engen
相关产品推荐
相关产品推荐

