Automapper - сопоставить отдельный объект со свойством массива N числом объектов на основе количества массивов - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь отобразить объект, который содержит массив, в список объектов, у которых нет массива.Например:

Допустим, у меня есть этот объект:

public class SourceInformation {
    public decimal Id { get; set; }
    public Person[] People { get; set; }
    ...
}

Класс персонажа:

public class Person {
    public string First { get; set; }
    public string Last { get; set; }
    public string Middle { get; set; }
}

И я хочу сопоставить этот объект:

public class Destination {
    public decimal Id { get; set; }
    public string Name { get; set; }
    ...
}

Но я хочу, чтобы в моем свойстве People было N Person объектов, и я хочу, чтобы при сопоставлении <SourceInformation, Destination>

каждый Destination объект возвращал N Destination объектов.должны иметь соответствующую информацию об имени, но все они будут иметь одно и то же свойство Id.

Как сообщить Automapper, что 1 объект SourceInformation отображается на N объектов Destination?

1 Ответ

0 голосов
/ 28 февраля 2019

Разобрался.Я закончил тем, что создал собственный Конвертер и Профиль.

Профиль:

public class MapperProfile : Profile {
    public MapperProfile() {
        CreateMap<SourceInformation, Destination>().ForMember(....);
        CreateMap<SourceInformation, IEnumerable<Destination>>().ConvertUsing<CustomConverter>();
    }
}

Конвертер:

public class CustomConverter : ITypeConverter<SourceInformation, IEnumerable<Destination>> {
    public IEnumerable<Destination> Convert(SourceInformation source, IEnumerable<Destination> destination, ResolutionContext context) {
        var destinations = new List<Destination>();
        foreach (var person in source.People) {
            var destination = context.Mapper.Map<Destination>(source);
            destination.Name = NameUtilStatic.FormatName(person.Name);
            destinations.Add(destination);
        }
        return destinations;
    }
}

Затем просто вызываю маппер (я использую маппер с инжекцией DI) это было так просто, как просто сказать _mapper.Map<SourceInformation, IEnumerable<Destination>>(source);

Сначала вам нужно будет загрузить свой профиль.Что-то вроде: Mapper.Initialize(cfg => { cfg.AddProfile<MapperProfile>(); });

Дополнительные примеры можно найти здесь: https://docs.automapper.org/en/stable/Configuration.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...