Automapper условное отображение с различными типами источников - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь сопоставить свойство пользовательского типа в DTO из одного из нескольких различных свойств навигации исходной сущности, в зависимости от того, какое из них не равно нулю.

Упрощенная версия (некоторые из условные карты удалены):

 CreateMap<MyDTO, MyEntity>()
                  .ForMember(dest => dest.Order,
                  opt =>
                  {
                  opt.MapFrom(src => src.OrderType1 != null ? src.OrderType1 :
                  src.OrderTypeA.OrderType1 != null ? OrderTypeA.OrderType1 :
                  src.OrderType2 != null ? src.OrderType2 : null
                  ));

Не скомпилируется, поскольку сущность OrderType2 имеет тип, отличный от OrderType1

Тип условного выражения не может быть определен, так как нет неявное преобразование между OrderType1 и OrderType2

Я попытался создать пустой тип, у которого оба типа сущностей наследуются от этого, а затем приведен к базовому типу в условном выражении. Это вызывает исключение, потому что у него есть несопоставленные типы для всех свойств.

Предположим, я мог бы реорганизовать использование базового класса в свойствах навигации повсюду и создать отображение от базового к производному для каждой сущности, чтобы заставить это работать, но чувствовать это внесло бы слишком много изменений.

Существует ли альтернативный подход к этому с использованием Automapper или другого способа решения проблемы - иметь несколько условий, которые могут возвращать различные типы источников для сопоставления?

1 Ответ

0 голосов
/ 24 февраля 2020

Это кажется слишком простым, но все заработало, приведя к объекту в условном выражении:

 CreateMap<MyDTO, MyEntity>()
                  .ForMember(dest => dest.Order,
                  opt =>
                  {
                  opt.MapFrom(src => src.OrderType1 != null ? src.OrderType1 :
                  src.OrderTypeA.OrderType1 != null ? OrderTypeA.OrderType1 :
                  src.OrderType2 != null ? (object)src.OrderType2 : null
                  ));

Это запускает и создает все необходимые карты.

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