如何将多个列表映射到单个列表?

时间:2016-11-30 05:07:09

标签: automapper

我的课程很少,他们有多个列表项,如下所示:

public class Request1
{
   public List<AdditionalApplicantData> AdditionalApplicantData { get; set;}

   public List<ApplicantData> ApplicantData { get; set; }
}

public class Request2 
{
  public List<ApplicantDetails> ApplicantData { get; set; }
}

我想将Request1映射到Request2,但ApplicantData的列表必须从多个来源映射,例如ApplicantData&amp;列表。 AdditionalApplicantData列表但不确定如何实现它可以有人请帮助我吗?

2 个答案:

答案 0 :(得分:0)

您可以使用createMap()功能使用下面的功能。资料来源:https://github.com/AutoMapper/AutoMapper/wiki/Before-and-after-map-actions

.AfterMap((src, dest) => {
    dest.ApplicantData = /*your logic here*/
    });

您应该将ApplicantData标记为don't map,因为您在源类中有一个名为ApplicantData的变量。你应该自己实现逻辑。

编辑: 初始化映射器时,为每个对象创建映射。所以对于你的情况来说就像是:

Mapper.Initialize(cfg => {
  cfg.CreateMap<Request1, Request2>()
    .ForMember(x => x.ApplicantData, opt => opt.Ignore()) //You want to implement your logic so ignore mapping
    .AfterMap((src, dest) => 
        {
            dest.ApplicantData = /*implement your logic here*/
        });
});

答案 1 :(得分:0)

public class ApplicantDetailsResolver : IValueResolver<Request1, Request2, List<ApplicantDetails>>
{
     public List<ApplicantDetails> Resolve(Request1 source, Request2 destination,List<ApplicantDetails> destMember, ResolutionContext context)
     {
        destination.ApplicantDetails = context.Mapper.Map<List<ApplicantDetails>>(source.ApplicantData);

        for (int i = 0; i < destination.ApplicantDetails.Count(); i++)
        {
            context.Mapper.Map(source.AdditionalApplicantData.ElementAt(i), destination.ApplicantDetails.ElementAt(i));
        }

        return destination.ApplicantDetails;
     }
}

我已经为多个来源的映射列表编写了上面的自定义值解析器,并且它的工作正常但问题是,它是否无法匹配不同命名的属性,我是否可以处理这种情况?