如何使用 Automapper 将目标中的数组映射到一个项目

How to map array in destination with one item using Automapper

我有 类 类:

class A
{
    public string str1 { get; set; }
    public string str2 { get; set; }
    public string str3 { get; set; }
}

class B
{
    public string bstr1 { get; set; }
    public string bstr2 { get; set; }
}

class C
{
    public string cstr1 { get; set; }
    public IEnumerable<B> barr1 { get; set; }
}

如何创建类似

的映射
this.CreateMap<A, C>()
    .ForMember(dest => dest.cstr1, exp => exp.MapFrom(scc => scc.str1))
    .ForMember(dest => dest.barr1, exp => exp.MapFrom(scc => scc))
    .IgnoreAllNonExisting();

this.CreateMap<A, B[]>()
    .ForMember(dest => dest[0].bstr1, exp => exp.MapFrom(scc => scc.str2))
    .ForMember(dest => dest[0].bstr2, exp => exp.MapFrom(scc => scc.str3))
    .IgnoreAllNonExisting();

用简单的话来说就是如何将对象映射到目标数组的第一项。

你可以这样做:

Mapper.CreateMap<A, B>()
      .ForMember(dest => dest.bstr1, exp => exp.MapFrom(src => src.str2))
      .ForMember(dest => dest.bstr2, exp => exp.MapFrom(src => src.str3));

Mapper.CreateMap<A, C>()
      .ForMember(dest => dest.cstr1, exp => exp.MapFrom(scc => scc.str1))
      .ForMember(dest => dest.barr1, exp => exp.ResolveUsing<AToBCollectionResolver>());

其中 AToBCollectionResolver:

class AToBCollectionResolver : ValueResolver<A, IEnumerable<B>>
{
    protected override IEnumerable<B> ResolveCore(A source)
    {
        return new[] { Mapper.Map<B>(source)};
    }
}