Automapper无法映射嵌套集合

时间:2020-07-16 08:35:43

标签: .net-core automapper

我试图弄清楚如何在automapper 9.0.0中进行此映射。有人可以帮我吗? 我有这些课

class User
{
    public string Name { get; set; }
    public Address[] Addresses { get; set; }
}
class Address
{
    public string StreetName { get; set; }
}

class UserDto
{
    public string Name { get; set; }
    public PropertiesDto Properties { get; set; }
}

class PropertiesDto
{
    public AddressDto[] Addresses { get; set; }
}

class AddressDto
{
    public string StreetName { get; set; }
}

我的目标是将地址数组放置在“ PropertiesDto”对象内,最终将有很多其他数组。

var user = new User { Name = "Foo", Addresses = new[] { new Address { StreetName = "Main St." } } };

        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Address[], AddressDto[]>();
            cfg.CreateMap<User, UserDto>()
                .ForMember(d => d.Properties.Addresses, opt => opt.MapFrom(s => s.Addresses));
        });

        IMapper mapper = new Mapper(config);
        var dtoUser = mapper.Map<UserDto>(user);
        Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(dtoUser));
        
        Console.WriteLine("Hit enter...");
        Console.ReadLine();

代码失败,并显示此错误消息。

未处理的异常。 System.ArgumentException:表达式'd => d.Properties.Addresses'必须解析为顶级成员,而不是任何子对象的属性。您可以使用ForPath(子类型上的自定义解析程序)或AfterMap选项。 (参数“ lambdaExpression”)

2 个答案:

答案 0 :(得分:1)

对于这种情况,有一个特殊的命令 - 如果您要映射到顶级以下的属性,则只需使用 .ForPath(如错误消息所示)代替 .ForMember。像这样:

        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Address[], AddressDto[]>();
            cfg.CreateMap<User, UserDto>()
                .ForPath(d => d.Properties.Addresses, opt => opt.MapFrom(s => s.Addresses));
        });

答案 1 :(得分:0)

对我有用的是使用反向映射。

var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Address, AddressDto>();
            cfg.CreateMap<UserDto, User>()
                .ForMember(d => d.Addresses, opt => opt.MapFrom(s => s.Properties.Addresses))
                .ReverseMap();
        });