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

Posted

技术标签:

【中文标题】如何通过 AutoMapper 实现具有通用 Queue 类型属性的对象映射【英文标题】:How to implement mapping of objects with properties of generic Queue type via AutoMapper 【发布时间】:2019-11-17 07:19:05 【问题描述】:

我想知道是否有正确的方法来映射包含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);

    

如果我们有 List&lt;Position&gt; 类型的 PositionLog 属性,List&lt;PositionDto&gt; 映射可以正常工作。如果我们将TargetDto 类中的PositionLog 属性类型更改为Queue&lt;Position&gt; 类型,那么它也可以正常工作。 我使用版本 8.1.1 和 .NET Core 2.2 的 AutoMapper

【问题讨论】:

【参考方案1】:

AM 没有特殊情况 Queue&lt;T&gt;List&lt;T&gt; 是默认集合类型。但是你可以使用ICollection&lt;PositionDto&gt;。然后你只需要

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

【讨论】:

以上是关于如何通过 AutoMapper 实现具有通用 Queue 类型属性的对象映射的主要内容,如果未能解决你的问题,请参考以下文章

AutoMapper 使用总结1

Automapper - 将多对多关联映射到平面对象的最佳实践

如何在global.asax中注册Automapper配置类?

AutoMapper 具有未映射属性的问题

如何使用automapper映射与多个表的数据集

如何在 .NetCore 中使用 AutoMapper 高级功能