如何将多个列表映射到单个列表?
问题描述:
我有几类,他们有像下面多个列表项:如何将多个列表映射到单个列表?
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映射到请求2,但ApplicantData的名单必须从像AdditionalApplicantData但不是ApplicantData &名单列表多个来源映射确定如何实现它可以有人请帮助我在这里?
答
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;
}
}
我在上面定制值解析器编写了来自多个来源的映射列表及其工作正常,但问题是它不能匹配其不同的命名属性,我有办法处理这种情况吗?
答
您可以使用以下功能与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*/
});
});
对不起,请您详细说明一下,因为我无法在此跟踪您? –
我编辑我的答案,所以它会更详细 – cokceken
我刚刚发布了一个答案,任何建议使其更好,以便它可以匹配命名不同的属性? –