Сопоставление объекта типа с пользовательским классом с помощью AutoMapper 6.1.1 в .NET 4.6.2.C#

Место общения программистов C#
Ответить
Anonymous
 Сопоставление объекта типа с пользовательским классом с помощью AutoMapper 6.1.1 в .NET 4.6.2.

Сообщение Anonymous »

Мой класс XmlOrder содержит два свойства

Код: Выделить всё

public class XmlOrder
{
public OrderType OrderType { get; set; }
public object Item { get; set; }
}
Если OrderType равен OrderType.Service, Item будет иметь тип XmlTransportElement. Если это OrderType.Transport, он будет иметь тип XmlTransport. XmlTransport имеет следующие два свойства:

Код: Выделить всё

public class XmlTransport
{
public XmlTransportElement Delivery { get; set; }
public XmlTransportElement Pickup { get; set; }
}

Код: Выделить всё

XmlOrder
необходимо сопоставить с Order, который выглядит следующим образом:

Код: Выделить всё

 public class Order : IOrder
{
public ITransportElement[] TransportElements { get; set; }
}
В соответствии с приведенной выше логикой этот массив будет содержать одну или две записи.
В моем примере проекта я написал это, используя последнюю версию Версия AutoMapper, и она работает отлично:

Код: Выделить всё

public class OrderProfile : Profile
{
public OrderProfile()
{
// Mapping for XmlOrder to IOrder
CreateMap()
.ConstructUsing(src => new Order())
.ForMember(dest => dest.TransportElements, opt => opt.MapFrom((src, dest, _, context) =>
src.Item is XmlTransport transport
? new[]
{
transport.Delivery != null ? context.Mapper.Map(transport.Delivery) : null,
transport.Pickup != null ? context.Mapper.Map(transport.Pickup) : null
}
: new[] { context.Mapper.Map((XmlTransportElement)src.Item) }
));

// Mapping for XmlTransportElement to TransportElement
CreateMap()
// additional logic
}
}
Проблема в том, что мне нужно реализовать это в устаревшем приложении с помощью AutoMapper 6.1.1. Приведенный выше код не работает, поскольку .MapFrom нельзя использовать таким образом в более старых версиях. Я ходил по кругу в течение двух дней и пробовал различные подходы, используя .ConvertUsing и .ResolveUsing в сочетании с пользовательским конвертером, но всегда получал NullReferenceExceptions или другие ошибки.
Последний подход, который я пробовал, был этот, который выдает исключение AutoMapperMappingException:

Код: Выделить всё

 CreateMap()
.ForMember(dest => dest.TransportElements, opt => opt.ResolveUsing(src =>
{
var transport = src.Item as Transport;
if (transport != null)
{
return new[]
{
transport.Delivery != null ? Mapper.Map(transport.Delivery) : null,
transport.Pickup != null ? Mapper.Map(transport.Pickup) : null
};
}
return new[] { Mapper.Map((XmlTransportElement)src.Item) };
}))
.ConstructUsing(src => new Order());
Любая помощь приветствуется. ИИ совершенно не помог и продолжает подсказывать вещи, которые не работают с этой конкретной версией AutoMapper.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -net-4-6-2
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»