Automapper 舍入所有十进制类型实例

Automapper Round All Decimal Type Instances

我需要一种方法来为我的自动映射器配置添加舍入。我已尝试按照此处的建议使用 IValueFormatter:Automapper Set Decimals to all be 2 decimals

但是 AutoMapper 不再支持格式化程序。我不需要将它转换为不同的类型,所以我不确定类型转换器是否是最佳解决方案。

这个问题现在还有好的automapper解决方案吗?

使用 AutoMapper 版本 6.11

这是一个完整的 MCVE,演示了如何配置 decimaldecimal 的映射。在此示例中,我将所有十进制值四舍五入为两位数:

public class FooProfile : Profile
{
    public FooProfile()
    {
        CreateMap<decimal, decimal>().ConvertUsing(x=> Math.Round(x,2));
        CreateMap<Foo, Foo>();
    }
}

public class Foo
{
    public decimal X { get; set; }
}

在这里,我们演示一下:

class Program
{
    static void Main(string[] args)
    {
        Mapper.Initialize(x=> x.AddProfile(new FooProfile()));

        var foo = new Foo() { X = 1234.4567M };
        var foo2 = Mapper.Map<Foo>(foo);
        Debug.WriteLine(foo2.X);
    }
}

预期输出:

1234.46

虽然 Automapper 确实知道如何立即将 decimal 映射到 decimal,但我们可以覆盖其默认配置并告诉它如何映射它们以满足我们的需要。

上面提供的答案是正确的。只是想指出我们也可以使用 AutoMapper 的 MapperConfiguration 来实现这一点,而不是 Profiles.

我们可以修改上面的代码来使用MapperConfiguration如下。

定义 Foo class

public class Foo
{
        public decimal X { get; set; }
}

修改main方法如下:

class Program
{
    private IMapper _mapper;

    static void Main(string[] args)
    {
        InitialiseMapper();

        var foo = new Foo() { X = 1234.4567M };
        var foo2 = _mapper.Map<Foo>(foo);
        Debug.WriteLine(foo2.X);
    }

    private void InitialiseMapper()
    {
        var mapperConfig = new MapperConfiguration(cfg =>
            {
                CreateMap<decimal, decimal>().ConvertUsing(x=> Math.Round(x,2));
                CreateMap<Foo, Foo>();                   
            });

            _mapper = mapperConfig.CreateMapper();            
    }
}