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

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实现,实现逻辑复用:

  1. 定义转换器类
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);
    }
}
  1. 映射配置中使用
CreateMap<Source, Target>()
  .ForMember(dest => dest.Rate, opts => 
    opts.ConvertUsing(new ScaledDecimalConverter(100M, 2), src => src.Rate));

该方案适合多属性复用同一种转换规则的场景,维护成本更低。

内容的提问来源于stack exchange,提问作者Brian Engen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:42:01