pratyaksh bhonsle
pratyaksh bhonsle

Reputation: 21

AutoMapper - Map object into list of objects

I want to map an object of PersonDetails class to a list of Details objects. The PersonDetails class is

public class PersonDetails
{
    public PersonItems PersonItems {get;set;}
    public int CreatedBy {get;set;}
    public string PersonCode {get;set;}
}

public class PersonItems
{
    public string ItemCode {get; set;}
    public List<string> ItemColors {get;set;}
    public string ItemName {get; set;}
}

For each ItemColor is trying to map this to the following list of object classes:

public class Seller
{
    public string SellerCode {get;set;}
    public Details details {get; set;}
}

public class Details
{
    public string ItemCode {get; set;}
    public string ItemColor {get;set;}
    public string ItemName {get; set;}
    public string PersonCode {get;set;}
}

I have tried the following code by applying a loop on ItemColors in the service class, via AutoMapper.

List<Details> detailsList = new();
foreach(string ItemColor in PersonDetails.PersonItems.ItemColor)
{
    Details details = _mapper.Map<PersonDetails>( details) ;
    details.Add(details);
}

I have created a separate mapper class to register mapper methods.

public void RegisterPersonDetailstoDetailsObjectList()
{
     CreateMap<PersonDetails,Details>()
         .ForMember(d => d.details.PersonCode, src=> src.MapFrom(src => src.PersonCode
         .ForMember(d => d.PersonItems, src => src.MapFrom(s => new Details
             {
                 ItemCode = s.PersonItems.ItemCode,
                 **ItemColor = s.PersonItems.ItemColor,**
                 ItemName = s.PersonItems.ItemName
             }
         }));
}

Can't figure out to get each ItemColor from the loop in bold text and pass it to this AutoMapper method. Basically, I want to iterate over itemColor and assign the same to each list of objects mapped.

Upvotes: 0

Views: 490

Answers (1)

Yong Shun
Yong Shun

Reputation: 51430

From my understanding of your question, you seem to map from the PersonDetails object to the List<Details> list.

You need the Custom Type Converter for the following mapping:

public void RegisterPersonDetailstoDetailsObjectList()
{
     CreateMap<PersonDetails, Details>()
        .ForMember(d => d.PersonCode, src=> src.MapFrom(src => src.PersonCode))
        .ForMember(d => d.ItemCode, src => src.MapFrom(src => src.PersonItems.ItemCode))
        .ForMember(d => d.ItemName, src => src.MapFrom(src => src.PersonItems.ItemName));

     CreateMap<PersonDetails, List<Details>>()
        .ConvertUsing((src, dest, ctx) =>
        {
            dest = new List<Details>();

            foreach (string itemColor in src.PersonItems.ItemColors)
            {
                var details = ctx.Mapper.Map<Details>(src);
                details.ItemColor = itemColor;

                dest.Add(details);
            }

            return dest;
        });
}

Demo @ .NET Fiddle

Upvotes: 2

Related Questions