Generics 使用开放泛型自动映射并在FormMember语句中包含源代码

Generics 使用开放泛型自动映射并在FormMember语句中包含源代码,generics,automapper,open-generics,automapper-5,Generics,Automapper,Open Generics,Automapper 5,我最近从Automapper 4.2.1升级到了5.1.1,并且在以前涉及开放泛型的有效映射方面遇到了问题 以前,在automapper配置中,我有以下打开的通用映射配置 CreateMap(typeof(IPager)、typeof(ModelPager)) .ForMember(“Items”,e=>e.MapFrom(o=>(IEnumerable)o)); 当尝试通过IMapper.map(源)进行映射时,这在Automapper 4中工作,但在5中失败,出现InvalidoPeria

我最近从Automapper 4.2.1升级到了5.1.1,并且在以前涉及开放泛型的有效映射方面遇到了问题

以前,在automapper配置中,我有以下打开的通用映射配置

CreateMap(typeof(IPager)、typeof(ModelPager))
.ForMember(“Items”,e=>e.MapFrom(o=>(IEnumerable)o));
当尝试通过
IMapper.map(源)
进行映射时,这在Automapper 4中工作,但在5中失败,出现
InvalidoPeriationException
。在执行项映射
ForMember
操作时,它似乎失败,异常消息为“序列不包含匹配元素”

如下面的示例实现代码所示
IPager
实现了
IEnumerable
,而
ModelPager
Items
属性是一个
IEnumerable
,因此强制转换应该是有效的。每个
t源
t目标

CreateMap();
IPager界面

公共接口IPager:IEnumerable
{
int CurrentPage{get;}
int PageCount{get;}
int PageSize{get;}
int TotalItems{get;}
}
IPager实施

公共类寻呼机:IPager
{
私有只读IEnumerable\u项;
公共寻呼机(IEnumberitems,
int当前页面,
int pageSize,
整数(项目总数)
{
///…逻辑。。。
此._items=项??可枚举的.Empty();
this.CurrentPage=CurrentPage;
this.PageSize=页面大小;
this.TotalItems=TotalItems;
}
public int CurrentPage{get;}
public int PageCount=>(this.TotalItems+this.PageSize-1)/this.PageSize;
公共int PageSize{get;}
公共整数TotalItems{get;}
IEnumerator IEnumerable.GetEnumerator()=>this.GetEnumerator();
public IEnumerator GetEnumerator()=>此项。GetEnumerator();
}
ModelPager

公共类模型寻呼机
{
public int CurrentPage{get;set;}
公共IEnumerable项{get;set;}
public int PageCount{get;set;}
公共int PageSize{get;set;}
公共整数TotalItems{get;set;}
}

在Automapper 5中映射此属性的正确方法是什么,而不必通过显式映射每个可能的映射而放弃,或者通过使用自定义的打开泛型(这需要我手动映射所有属性并使用反射来解析分配的打开类型?

鉴于这看起来是一个bug(),可以使用自定义的、不需要反射的、打开的、通用的
类型转换器来解决问题

映射应该更改为与

CreateMap(typeof(IPager)、typeof(ModelPager))
.转换使用(类型(PagerToModelPagerConverter));
使用自定义的
ITypeConverter

公共类PagerToModelPagerConverter:ITypeConverter
{
公共ModelPager转换(IPager源,
寻呼机目的地,
决议(上下文)
{
var list=source.ToList();//避免重复迭代
var itemMapping=context.Mapper.Map(列表);
var modelPager=新modelPager
{
CurrentPage=source.CurrentPage,
Items=itemMapping,
PageCount=source.PageCount,
PageSize=source.PageSize,
TotalItems=source.TotalItems
};
返回模式寻呼机;
}

这看起来像个bug,你能打开GitHub问题吗?@JimmyBogard can doIssue已经提交