Преобразование одного исходного объекта в место назначения списка типов - PullRequest
0 голосов
/ 05 марта 2020

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

исходный объект

public class ShipmentEntity
{
    public virtual long Id { get; set; }
    public virtual string OrderId { get; set; }

    .....    
 }

целевой объект

public class DeliveryLabelResponse
{

    public bool Success { get; set; }
    public DeliveryLabel Label { get; set; }
    public Exception Error { get; set; }        
}
}

public class DeliveryLabel
{
    public  ShippingOption Option { get; set; } = new ShippingOption();     
    public  List<ShippingOptionLabel> Label { get; set; }= new List<ShippingOptionLabel>();
}

public class ShippingOptionLabel
{
    public string ShippingProvider { get; set; }
    public virtual string Message { get; set; }
    ....
}

простая карта

  CreateMap<ShipmentEntity, DeliveryLabelResponse>()
            .ForMember(des => des.Label.Label, x => x.MapFrom(src => src))

Выражение 'des => des.Label.Label' должно преобразовываться в элемент верхнего уровня, а не в свойства любого дочернего объекта. Вместо этого вы можете использовать ForPath, пользовательский преобразователь для дочернего типа или параметр AfterMap.

для пути

CreateMap<ShipmentEntity, DeliveryLabelResponse>()
            .ForPath(des => des.Label.Label, opt => opt.MapFrom(src => src))
            .ForMember(des => des.Success, x => x.MapFrom(src => true))
            .ForMember(des => des.Error, x => x.MapFrom(src => src));

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

Метка

для попытки два пути

CreateMap<ShipmentEntity, DeliveryLabelResponse>()
                .ForPath(des => des.Label, opt => new DeliveryLabel())
                .ForPath(des => des.Label.Label, opt => new List<ShippingOptionLabel>() { new ShippingOptionLabel() { }})
                .ForMember(des => des.Success, x => x.MapFrom(src => true))
                .ForMember(des => des.Error, x => x.MapFrom(src => src));

Test_unit.Mapping.AutoMapperTests.Mapping_config_is_valid

System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объект.

Рассмотрим ConvertUsing

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

.ConvertUsing(source => source.Prices?.Select(p => new PriceDto
                    {
                        Ticker = source.Security?.Ticker,
                        Open = p.Open,
                        Close = p.Close
                    }).ToList()
                );
...