AutoMapper сопоставляет исходное свойство с внутренним целевым объектом - PullRequest
0 голосов
/ 25 июня 2018

У меня есть один исходный класс:

class Source {
    public string Name;
    public string Field1;
    public string Field2;
}

и два класса назначения:

class Destination {
    public string Name;
    public FieldsDto Fields;
}

class FieldsDto {
    public string Field1;
    public string FieldTwo;
}

Как мне сопоставить Source.Field1 с Destination.Fields.Field1 и Source.Field2 с Destination.Fields.FieldTwo?

Этот код не работает;будет выдано сообщение о том, что Custom configuration for members is only supported for top-level individ ual members on a type1:

Mapper.Initialize(cfg => {
    cfg.CreateMap<Source, Destination>()
        .ForMember(dest => dest.Fields.Field1, opt => opt.Mapfrom(src => src.Field1)
        .ForMember(dest => dest.Fields.FieldTwo, opt => opt.Mapfrom(src => src.Field2);
});

1 Ответ

0 голосов
/ 26 июня 2018

Как упоминалось в комментариях, для сопоставления вложенных свойств вам нужно будет использовать 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)));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...