自动映射器映射列表成员在源为空时如何使用目标

时间:2019-09-27 13:16:42

标签: c# automapper automapper-8

我正在使用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 :(得分:-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;
        }
    }