如何用AutoMapper将PersonDetails对象映射为Details对象列表?
问题:将PersonDetails对象映射为多颜色对应的Details列表
需要把PersonDetails类的对象转换为Details类的对象列表,每个ItemColors集合中的颜色值对应一个Details实例。
类定义
源类(PersonDetails、PersonItems)
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; } }
目标类(Seller、Details)
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; } }
现有尝试的问题
服务类遍历代码(存在语法/逻辑错误)
List<Details> detailsList = new(); // 错误1:ItemColor拼写错误,应为ItemColors foreach(string ItemColor in PersonDetails.PersonItems.ItemColor) { // 错误2:Map泛型参数顺序反了,应该是Map<Details>(源对象) Details details = _mapper.Map<PersonDetails>( details) ; // 错误3:应该是detailsList.Add(details),不是details.Add details.Add(details); }
AutoMapper配置代码(存在语法/逻辑错误)
public void RegisterPersonDetailstoDetailsObjectList() { CreateMap<PersonDetails,Details>() // 错误1:ForMember括号未闭合,语法错误 .ForMember(d => d.details.PersonCode, src=> src.MapFrom(src => src.PersonCode // 错误2:试图将List<string>(ItemColors)赋值给单个string类型的ItemColor,逻辑错误 .ForMember(d => d.PersonItems, src => src.MapFrom(s => new Details { ItemCode = s.PersonItems.ItemCode, ItemColor = s.PersonItems.ItemColor, ItemName = s.PersonItems.ItemName } })); }
解决方案
方案1:循环结合AutoMapper映射基础字段
先通过AutoMapper映射PersonDetails到Details的基础字段,再在循环中手动设置每个颜色值。
AutoMapper配置
public void RegisterMappings() { CreateMap<PersonDetails, Details>() // 映射PersonCode .ForMember(dest => dest.PersonCode, opt => opt.MapFrom(src => src.PersonCode)) // 从PersonItems映射ItemCode和ItemName .ForMember(dest => dest.ItemCode, opt => opt.MapFrom(src => src.PersonItems.ItemCode)) .ForMember(dest => dest.ItemName, opt => opt.MapFrom(src => src.PersonItems.ItemName)) // ItemColor留到循环中手动赋值,暂时忽略映射 .ForMember(dest => dest.ItemColor, opt => opt.Ignore()); }
服务类代码
// 假设personDetails是传入的PersonDetails实例 List<Details> detailsList = new List<Details>(); if (personDetails?.PersonItems?.ItemColors != null) { foreach (string itemColor in personDetails.PersonItems.ItemColors) { Details details = _mapper.Map<Details>(personDetails); details.ItemColor = itemColor; detailsList.Add(details); } }
方案2:使用AutoMapper自定义转换器直接生成列表
通过实现ITypeConverter,让AutoMapper直接将PersonDetails转换为List<Details>,无需手动循环。
AutoMapper配置
public void RegisterMappings() { CreateMap<PersonDetails, List<Details>>() .ConvertUsing<PersonDetailsToDetailsListConverter>(); } // 自定义转换器类 public class PersonDetailsToDetailsListConverter : ITypeConverter<PersonDetails, List<Details>> { public List<Details> Convert(PersonDetails source, List<Details> destination, ResolutionContext context) { // 空值判断,避免空引用异常 if (source == null || source.PersonItems == null || source.PersonItems.ItemColors == null) { return new List<Details>(); } // 遍历颜色列表生成Details对象 return source.PersonItems.ItemColors.Select(color => new Details { PersonCode = source.PersonCode, ItemCode = source.PersonItems.ItemCode, ItemName = source.PersonItems.ItemName, ItemColor = color }).ToList(); } }
服务类代码
// 直接映射生成列表 List<Details> detailsList = _mapper.Map<List<Details>>(personDetails);
内容的提问来源于stack exchange,提问作者pratyaksh bhonsle
相关产品推荐
相关产品推荐

