You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:45:34