Код: Выделить всё
public class XmlOrder
{
public OrderType OrderType { get; set; }
public object Item { get; set; }
}
Код: Выделить всё
public class XmlTransport
{
public XmlTransportElement Delivery { get; set; }
public XmlTransportElement Pickup { get; set; }
}
Код: Выделить всё
XmlOrderКод: Выделить всё
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
}
}
Последний подход, который я пробовал, был этот, который выдает исключение 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());
Подробнее здесь: https://stackoverflow.com/questions/790 ... -net-4-6-2
Мобильная версия