Automapper Round All Decimal Type Instances

Мне нужен способ добавить округление в конфигурацию моего автопроизводителя. Я попытался использовать IValueFormatter как предложено здесь: Automapper Установите Десятичные знаки, чтобы все были 2 десятичных знака

Но AutoMapper больше не поддерживает форматеры. Мне не нужно преобразовывать его в другой тип, поэтому я не уверен, что преобразователь типов также является лучшим решением.

Есть ли еще хорошее решение для этой проблемы?

Использование AutoMapper версии 6.11

2 ответа

Решение

Это полный MCVE, демонстрирующий, как вы можете настроить отображение decimal в decimal, В этом примере я округляю все десятичные значения до двух цифр:

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 вместо Profiles.

Мы можем изменить приведенный выше код, чтобы использовать MapperConfiguration следующее.

Определите класс Foo

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

Измените основной метод следующим образом:

      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();            
    }
}
Другие вопросы по тегам