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

如何使用AutoMapper将源字段映射到嵌套对象属性?

如何用AutoMapper将GameResponseModel的阵容映射到Team的Roster属性?

场景说明

在.NET 7项目中使用AutoMapper.Extensions.Microsoft.DependencyInjection(12.0.0),API返回的比赛信息反序列化为GameResponseModel:

public class GameResponseModel
{
  public int Id { get; set; }
  public DateTime Start { get; set; }
  public TeamResponseModel HomeTeam { get; set; }
  public TeamResponseModel AwayTeam { get; set; }
  public List<PlayerResponseModel> HomeTeamRoster { get; set; }
  public List<PlayerResponseModel> AwayTeamRoster { get; set; }
}

public class TeamResponseModel
{
    public string Name { get; set; }
    public string Location { get; set; }
}

public class PlayerResponseModel
{
    // 球员相关属性
}

目标模型需要将阵容集合作为Team的属性:

public class Game {
  public int Id { get; set; }
  public DateTime Start { get; set; }
  public Team HomeTeam { get; set; }
  public Team AwayTeam { get; set; }
}

public class Team
{
  public string Name { get; set; }
  public string Location { get; set; }
  public List<Player> Roster { get; set; }
}

public class Player
{
    // 映射后的球员属性
}

你原尝试的配置会引发空引用异常,因为AutoMapper不会自动初始化HomeTeam/AwayTeam对象就去设置其Roster属性,以下是两种可行的实现方式:

方案一:使用MapFrom构建完整Team对象

通过MapFrom的重载,结合已有的映射规则,将原TeamResponseModel的属性和对应阵容合并为目标Team对象:

CreateMap<PlayerResponseModel, Player>();
CreateMap<TeamResponseModel, Team>();

CreateMap<GameResponseModel, Game>()
    .ForMember(dest => dest.HomeTeam, opt => opt.MapFrom((src, _, _, context) => 
    {
        var team = context.Mapper.Map<Team>(src.HomeTeam);
        team.Roster = context.Mapper.Map<List<Player>>(src.HomeTeamRoster);
        return team;
    }))
    .ForMember(dest => dest.AwayTeam, opt => opt.MapFrom((src, _, _, context) => 
    {
        var team = context.Mapper.Map<Team>(src.AwayTeam);
        team.Roster = context.Mapper.Map<List<Player>>(src.AwayTeamRoster);
        return team;
    }));

方案二:使用AfterMap后置操作

先完成GameResponseModel到Game的基础映射,再在映射完成后为Team的Roster属性赋值:

CreateMap<PlayerResponseModel, Player>();
CreateMap<TeamResponseModel, Team>();

CreateMap<GameResponseModel, Game>()
    .AfterMap((src, dest, context) => 
    {
        dest.HomeTeam.Roster = context.Mapper.Map<List<Player>>(src.HomeTeamRoster);
        dest.AwayTeam.Roster = context.Mapper.Map<List<Player>>(src.AwayTeamRoster);
    });

这种方式需要确保TeamResponseModel不为null,AutoMapper会自动映射出对应的Team实例,避免空引用。

内容的提问来源于stack exchange,提问作者Santi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:16:01