Элемент списка сопоставления Automapper, как использовать пункт назначения, если источник пуст

Я отображаю классы ниже, используя 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 ответ

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

Я часто считаю полезным обрабатывать более сложные сопоставления в 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;
        }
    }
Другие вопросы по тегам