C# Внутренний список Automapper из другого внутреннего списка другого типа - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь сопоставить что-то похожее на эту модель:

class Source {
   ...
   SubSource subSource;
}

class SubSource {
   ...
   List<SourceListItem> list;
   SomeInfo someInfo;
   ...
}

class SomeInfo {
   string name;
   ...
}

class SourceModel {
   ...
   SomeInfoModel someInfoModel;
   ...
}

class SomeInfoModel {
   string name;
   List<SourceListItemModel> list;
   ...
}

Мне нужно сопоставить SubSource.List с SomeInfoModel.List. Я могу правильно сопоставить все остальные свойства, но после сопоставления список всегда пуст, и при выполнении не возникает ошибок.

У меня есть следующая конфигурация для сопоставлений:

CreateMap<SourceListItem, SourceListItemModel>()
CreateMap<SomeInfo, SomeInfoModel>()
CreateMap<Source, SourceModel>()
 ...
 .ForPath(dest => dest.someInfoModel.list, opt => opt.MapFrom(src => 
 src.subSource.list))
...

Ответы [ 2 ]

1 голос
/ 31 марта 2020

При выполнении вашего кода, вызов configuration.AssertConfigurationIsValid(); вызывает исключение, где четко описана проблема, с которой вы столкнулись

Найдены не отображенные элементы. Просмотрите типы и членов ниже. Добавьте пользовательское выражение сопоставления, игнорируйте, добавьте пользовательский преобразователь или измените тип источника / назначения.

Если конструктор не соответствует, добавьте ctor без аргументов, добавьте необязательные аргументы или отобразите все параметры конструктора

SomeInfo -> SomeInfoModel (список участников-адресатов) SomeInfo -> SomeInfoModel (список участников-адресатов)

Несопоставленные свойства: список

Вы можете обратиться к документация

0 голосов
/ 31 марта 2020

Пытался воспроизвести, но для меня отображение свойства list работает.

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<SourceListItem, SourceListItemModel>();
    cfg.CreateMap<SomeInfo, SomeInfoModel>();
    cfg.CreateMap<Source, SourceModel>()
        .ForPath(dest => dest.someInfoModel.list, opt => opt.MapFrom(src =>
         src.subSource.list));
    });

var source = new Source()
{
    subSource = new SubSource()
    {
        list = new List<SourceListItem>()
        {
            new SourceListItem() { Text1 = "text1" },
            new SourceListItem() { Text1 = "text2" },
        }
    }
};
var mapper = new Mapper(config);
var model = mapper.Map<SourceModel>(source);

Используемая модель:

public class SourceListItem
{
    public string Text1 { get; set; }
}
public class SourceListItemModel
{
    public string Text1 { get; set; }
}
...