Automapper mapping Список членов, как использовать пункт назначения, если источник пуст - PullRequest
0 голосов
/ 27 сентября 2019

Я отображаю ниже классы, используя Automapper

public class InfoDto
{
    public List<string> Names { get; set; }
}

public class Info
{
    public List<string> Names { get; set; }
}

Я хочу сохранить значение destination Names, если source Names равно нулю или пусто.Я попытался настроить Mapper, как показано ниже, но перед отображением он очищается destination Names.

    CreateMap<InfoDto, Info>()
        .ForMember(d => d.Names,
            opt => opt.MapFrom(
                (src, dest) =>
                    src.Names != null && src.Names.Any() ? src.Names : dest.Names));

var infoDto = new InfoDto{ Names = new List<string>{"Test1", "Test2"}}; 
var info = Mappert.Map<Info>(infoDto);

var infoDto1 = new InfoDto{ Names = null}; 
Mapper.Map<InfoDto, Info>(infoDto1, info); 
// info.Names should be list with 2 values

Есть ли способ получить / сохранить значение destination Names и использовать его, если source Names пусто?

1 Ответ

0 голосов
/ 27 сентября 2019

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

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

        CreateMap<InfoDto, Info>()
            .ForMember(d => d.Names, opt => opt.Ignore())
            // here you can map other properties just regularly if you want
            .AfterMap(mapNames);

Вы игнорируете свойства, которые хотите отобразить, в методе Aftermap.В вашем случае Aftermap будет выглядеть примерно так:

private void mapNames(InfoDto source, Info destination)
    {
        if (source.Names != null && source.Names.Any())
        {
            destination.Names = source.Names;
        }
    }
...