2016-11-30 79 views
0

我有幾類,他們有像下面多個列表項:如何將多個列表映射到單個列表?

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 &名單列表多個來源映射確定如何實現它可以有人請幫助我在這裏?

回答

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; 
    } 
} 

我在上面定製值解析器編寫了來自多個來源的映射列表及其工作正常,但問題是它不能匹配其不同的命名屬性,我有辦法處理這種情況嗎?

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*/ 
     }); 
}); 
+0

對不起,請您詳細說明一下,因爲我無法在此跟蹤您? –

+0

我編輯我的答案,所以它會更詳細 – cokceken

+0

我剛剛發佈了一個答案,任何建議使其更好,以便它可以匹配命名不同的屬性? –

相關問題