我试图弄清楚如何在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”)
答案 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();
});