如何通过 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<Position>
类型的 PositionLog
属性,List<PositionDto>
映射可以正常工作。如果我们将TargetDto
类中的PositionLog
属性类型更改为Queue<Position>
类型,那么它也可以正常工作。
我使用版本 8.1.1 和 .NET Core 2.2 的 AutoMapper
【问题讨论】:
【参考方案1】:AM 没有特殊情况 Queue<T>
,List<T>
是默认集合类型。但是你可以使用ICollection<PositionDto>
。然后你只需要
cfg.CreateMap<Target, TargetDto>();
cfg.CreateMap<Position, PositionDto>();
【讨论】:
以上是关于如何通过 AutoMapper 实现具有通用 Queue 类型属性的对象映射的主要内容,如果未能解决你的问题,请参考以下文章
Automapper - 将多对多关联映射到平面对象的最佳实践