Как реализовать сопоставление объектов со свойствами универсального типа очереди через AutoMapper - PullRequest
0 голосов
/ 07 июля 2019

Я хотел бы знать, существует ли правильный подход к объектам карты, содержащим свойства типа Queue<T>.
Отображение работает для Queue<int> Log свойств в обоих классах.Но для Queue<PositionDto> PositionLog в классе TargetDto количество элементов всегда равно 0 после сопоставления.

Вот упрощенный код, демонстрирующий, что:

class Program
{
    public class Target
    {
        public int Id { get; set; }

        public Queue<int> Log { get; set; }

        public Queue<Position> PositionLog { get; set; }
    }

    public class TargetDto
    {
        public int Id { get; set; }

        public Queue<int> Log { get; set; }

        public Queue<PositionDto> PositionLog { get; set; }
    }

    public class Position{ }

    public class PositionDto{ }

    static void Main(string[] args)
    {
        var configuration = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<Target, TargetDto>()
                .ForMember(dest => dest.PositionLog, opt => opt.MapFrom(src => src.PositionLog));
            cfg.CreateMap<Position, PositionDto>();
            cfg.CreateMap<Queue<Position>, Queue<PositionDto>>();
        });

        configuration.AssertConfigurationIsValid();
        var mapper = configuration.CreateMapper();

        var target1 = new Target() {Id = 0};
        target1.Log = new Queue<int>();
        target1.Log.Enqueue(1);
        target1.Log.Enqueue(2);
        target1.Log.Enqueue(3);

        target1.PositionLog = new Queue<Position>();
        var p1 = new Position();
        var p2 = new Position();
        target1.PositionLog.Enqueue(p1);
        target1.PositionLog.Enqueue(p2);

        var targetDto = mapper.Map<TargetDto>(target1);

    }
}

В случае, если у нас есть PositionLog свойства типа List<Position> и List<PositionDto> сопоставление работает правильно.Если мы изменим тип свойства PositionLog в классе TargetDto на тип Queue<Position>, то это также будет работать.

Я использую AutoMapper версии 8.1.1 и .NET Core 2.2

1 Ответ

0 голосов
/ 07 июля 2019

AM не является специальным случаем Queue<T>, List<T> является типом коллекции по умолчанию.Но вы можете использовать ICollection<PositionDto>.И тогда вам нужно просто

    cfg.CreateMap<Target, TargetDto>();
    cfg.CreateMap<Position, PositionDto>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...