AutoMapper не может отображать значения, допускающие значение NULL, с помощью конвертера - PullRequest
0 голосов
/ 14 июля 2020

У меня есть следующие два объекта POCO:

private class Person
{
    public string Name { get; set; }
    public int? Age { get; set; }
}

private class PersonDto
{
    public string Name { get; set; }
    public int? Age { get; set; }
}

В моем приложении я хочу реализовать стандартное поведение, при котором значения с нулевым значением не перезаписывают свои цели при их сопоставлении. Это код, который я пытался выполнить:

var mapper = new MapperConfiguration(m =>
{
    m.CreateMap<Person, PersonDto>().ReverseMap();
    m.CreateMap(typeof(Nullable<>), typeof(Nullable<>)).ConvertUsing(typeof(NullableConverter<>));
}).CreateMapper();

var person = new Person
{
    Name = "Steve",
    Age = null
};
var personDto = new PersonDto
{
    Name = "Steve",
    Age = 20
};

var result = mapper.Map(person, personDto);
Console.WriteLine(personDto.Age);

Я ожидал, что в сообщении Console.WriteLine(personDto.Age); будет напечатано 20. NullableConverter реализуется следующим образом:

public class NullableConverter<TSource> : ITypeConverter<TSource, TSource>
{
    public TSource Convert(TSource source, TSource destination, ResolutionContext context)
    {
        return source == null ? destination : source;
    }
}

Вместо этого меня приветствует следующее исключение в отношении отображения свойства Age: System.InvalidCastException: Unable to cast object of type 'Test.NullableConverter´1[System.Int32]' to type 'AutoMapper.ITypeConverter´2[System.Nullable´1[System.Int32],System.Nullable´1[System.Int32]]'. Для меня это не имеет смысла. Почему AutoMapper пытается присвоить NullableConverter<int> ITypeConverter<int?, int?>. Очевидно, что это не сработает. Разве не следует пытаться использовать NullableConverter<int?>? Это похоже на ошибочное поведение. Я что-то упустил?

Я использую AutoMapper v10

1 Ответ

5 голосов
/ 14 июля 2020

Укажите Nullable (?) непосредственно в вашем конвертере:

public class NullableConverter<TSource> : ITypeConverter<TSource?, TSource?> where TSource: struct
{
    public TSource? Convert(TSource? source, TSource? destination, ResolutionContext context)
    {
        return source.HasValue ? source : destination ;
    }
}

Также, если вы хотите игнорировать все нулевые элементы источника, вы можете сделать что-то вроде this .

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