Automapper映射带构造参数泛型:PagedList无默认构造函数报错
解决PagedList无默认构造函数导致的映射错误问题
我之前也碰到过一模一样的坑!当你用AutoMapper这类映射工具处理IPagedList<T>的时候,因为PagedList通常没有无参构造函数,映射器没办法自动实例化目标分页对象,就会抛出映射失败的错误。下面给你几个实用的解决思路:
1. 给AutoMapper配置自定义分页映射规则
如果用的是AutoMapper,你可以专门为IPagedList<Application>到IPagedList<ApplicationModel>写一个转换规则,手动告诉映射器怎么创建目标分页对象:
// 在AutoMapper配置文件中添加 CreateMap<IPagedList<Application>, IPagedList<ApplicationModel>>() .ConvertUsing(source => new PagedList<ApplicationModel>( source.Select(item => _mapper.Map<ApplicationModel>(item)), source.PageNumber, source.PageSize, source.TotalItemCount));
注意这里要替换成你项目里实际的Mapper实例,别用静态的Mapper.Map(除非你确实是这么配置的)。
2. 封装通用的分页列表映射扩展方法
写一个扩展方法把分页映射逻辑复用起来,以后其他实体的分页转换也能直接用:
public static class PagedListMappingExtensions { public static IPagedList<TDestination> MapToPagedList<TSource, TDestination>( this IPagedList<TSource> source, IMapper mapper) { var mappedItems = mapper.Map<IEnumerable<TSource>, IEnumerable<TDestination>>(source); return new PagedList<TDestination>( mappedItems, source.PageNumber, source.PageSize, source.TotalItemCount); } }
使用的时候就很简单:
var applicationPage = GetApplications(); var modelPage = applicationPage.MapToPagedList<Application, ApplicationModel>(_mapper);
3. 封装支持无参构造的自定义PagedList
如果不想每次都写映射规则,也可以自己封装一个带无参构造函数的PagedList子类,让映射器能自动实例化:
public class MappablePagedList<T> : PagedList<T> { // 给映射器用的无参构造函数 public MappablePagedList() : base(Enumerable.Empty<T>(), 1, 10) { } // 保留原有的业务构造函数 public MappablePagedList(IEnumerable<T> items, int pageNumber, int pageSize, int totalItemCount) : base(items, pageNumber, pageSize, totalItemCount) { } }
之后把GetApplications的返回类型改成IPagedList<Application>或者直接返回MappablePagedList<Application>,映射器就能正常工作了。
本质上就是映射工具需要无参构造函数来创建目标对象,而原生PagedList没有提供,所以要么手动指定实例化逻辑,要么给它一个能无参创建的版本。
内容的提问来源于stack exchange,提问作者Heinrich
相关产品推荐
相关产品推荐

