如何通过AutoMapper实现具有通用Queue类型属性的对象的映射

时间:2019-07-07 15:44:12

标签: c# .net .net-core mapping automapper

我想知道是否有一种正确的方法来映射包含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>类型,则它也可以正常工作。

我使用版本8.1.1和.NET Core 2.2的AutoMapper

1 个答案:

答案 0 :(得分:0)

AM并非特殊情况Queue<T>List<T>是默认集合类型。但是您可以使用ICollection<PositionDto>。然后您只需要

    cfg.CreateMap<Target, TargetDto>();
    cfg.CreateMap<Position, PositionDto>();