Automapper Round所有十进制类型实例

时间:2017-12-19 15:05:29

标签: c# automapper automapper-6

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

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

现在还有一个很好的自动播放器解决方案吗?

使用AutoMapper版本6.11

2 个答案:

答案 0 :(得分:2)

这是一个完整的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开箱即可,但我们可以覆盖其默认配置并告诉它如何映射它们以满足我们的需求。

答案 1 :(得分:0)

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

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

定义Foo类

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();            
    }
}