Отображение обнуляемого и не обнуляемого двойного значения с использованием ValueTransformer - PullRequest
1 голос
/ 24 февраля 2020

У меня есть класс с double и double?, и я хочу округлить эти значения в процессе сопоставления.

Я создал небольшой пример кода, чтобы проиллюстрировать проблему, с которой я сталкиваюсь:

Когда я использую AddTransform<double?>, преобразование работает для double?, но ничего не делает для double. Когда я добавляю AddTransform<double>, преобразование работает, пока все обнуляемые поля имеют значение. Когда оба преобразователя добавлены и по крайней мере одно поле равно нулю, я вижу следующую ошибку:

AutoMapper.AutoMapperMappingException

Inner Exception 1:
InvalidOperationException: Nullable object must have a value.


Error mapping types.

Mapping types:
TestSource -> TestDestination
AutoMapperValueTransformer.TestSource -> AutoMapperValueTransformer.TestDestination

Type Map configuration:
TestSource -> TestDestination
AutoMapperValueTransformer.TestSource -> AutoMapperValueTransformer.TestDestination

Destination Member:
Prop3


Здесь код для воспроизведения вопроса

using System;

using AutoMapper;

namespace AutoMapperValueTransformer
{
    internal static class Program
    {
        static void Main(string[] args)
        {
            var config = new MapperConfiguration(cfg => 
                cfg.CreateMap<TestSource, TestDestination>()
                    .AddTransform<double?>(t => t.HasValue ? Math.Round(t.Value, 3) : t)
                    //.AddTransform<double>(t => Math.Round(t, 3))
                    );
            var mapper = config.CreateMapper();

            var src = new TestSource()
            {
                Prop1 = 3.3454353,
                Prop2 = 3.3454353,
                Prop3 = null,
            };

            var dst = mapper.Map<TestSource, TestDestination>(src);

            Console.WriteLine(dst.Prop1);
            Console.WriteLine(dst.Prop2);
            Console.WriteLine(dst.Prop3);
        }
    }

    internal class TestSource
    {
        public double Prop1 { get; set; }

        public double? Prop2 { get; set; }

        public double? Prop3 { get; set; }
    }

    internal class TestDestination
    {
        public double Prop1 { get; set; }

        public double? Prop2 { get; set; }

        public double? Prop3 { get; set; }
    }
}

1 Ответ

1 голос
/ 24 февраля 2020

Используйте это вместо:

cfg.CreateMap<double, double>().ConvertUsing(source => Math.Round(source, 3));

Или попробуйте MyGet build.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...