Automapper 不映射空源

Automapper don't map null sources

我正在使用 Automapper,我需要将对象列表映射到嵌套对象中。我有这些对象:

public abstract class FooSrcBase
{
}

public class FooSrc : FooSrcBase
{
    public bool Prop { get; set; }
}

public class FooDest
{
    public bool Prop { get; set; }
}

public class FooDestGroup
{
    public FooDest FooDest { get; set; }
}

public class Dest
{
    public FooDestGroup FooDestGroup { get; set; }
}

我有 IEnumerable<FooSrc>,其中包含 FooSrc 个对象(有很多实现,源中每种类型可能只存在一个对象),我需要将其映射到 Dest目的。我需要这个因为映射到前端的视图模型。

当我这样注册映射时:

CreateMap<IEnumerable<FooSrc>, Dest>().ForPath(dest => dest.FooDestGroup.FooDest, opt => opt.MapFrom(src => src.FirstOrDefault(x => x.GetType() == typeof(FooSrc))));

CreateMap<FooSrc, FooDest>();

当我映射空列表时,Dest 对象出现问题 - FooDestGroup 是一个对象实例,它有一个 属性 FooDestnull值。

如果我提供空列表作为源,如何使 Dest 属性 FooDestGroup 映射到 null

首先,您的摘要 FooSrc class 需要一个不同的名称(与您的具体 class 名称冲突 FooSrc

如何修改 Dest 的构造函数来避免嵌套问题? Automapper 能够自动映射到构造函数参数,但如果您需要更高级的行为,您可以参考 https://docs.automapper.org/en/stable/Construction.html

像这样的东西应该可以工作:

public class Dest
{
    public FooGroup FooGroup { get; set; }

    public Dest(FooDest fooDest) 
    {
        FooGroup = new FooGroup { FooDest = fooDest };
    }
}

[..]

Mapper.CreateMap<FooSrc, Dest>();

Mapper.Map<List<Dest>>(listOfFooSrc);

这解决了我的问题:

CreateMap<IEnumerable<FooSrcBase>, Dest>()
    .ForMember(dest => dest.FooDestGroup, opt => opt.MapFrom(src => src.FirstOrDefault(x => x.GetType() == typeof(FooSrc))));

CreateMap<FooSrc, FooDestGroup>()
    .ForMember(dest => dest.FooDest, opt => opt.MapFrom(src => src));

CreateMap<FooSrc, FooDest>();