Как упоминалось в комментариях, для сопоставления вложенных свойств вам нужно будет использовать ForPath
вместо ForMember
.Таким образом, полная конфигурация может выглядеть следующим образом:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(s => s.Name))
.ForPath(dest => dest.Fields.Field1, opt => opt.MapFrom(src => src.Field1))
.ForPath(dest => dest.Fields.FieldTwo, opt => opt.MapFrom(src => src.Field2));
});
Если вы хотите сделать это динамически, используя имена членов в виде строки (что выглядит как то, что вы хотите сделать, как я узнал в чате), тогда выне сможет легко использовать ForPath
, поскольку для этого абсолютно необходимо лямбда-выражение, содержащее только выражение члена.
Что вы могли бы сделать - это динамически создать лямбда-выражение для вложенного членадоступ.Я уверен, что вы найдете достаточно примеров того, как создавать такие лямбда-выражения здесь, если вы ищете его.
Альтернативой может быть разделение отображения на отдельные типы.Таким образом, вместо сопоставления непосредственно с вложенными свойствами Destination
, вы отображаете вложенный объект отдельно.Как это:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Source, FieldsDto>()
.ForMember("Field1", opt => opt.MapFrom("Field1"))
.ForMember("FieldTwo", opt => opt.MapFrom("Field2"));
cfg.CreateMap<Source, Destination>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(s => s.Name))
.ForMember(dest => dest.Fields, opt => opt.MapFrom(s => Mapper.Map<FieldsDto>(s)));
});