我很难映射我创建的自定义页面列表集合。
我有一个像这样的pagedList接口:
public interface IPagedList<T> : IList<T>
实施:
public class PagedList<T> : List<T>, IPagedList<T>
映射配置:
Mapper.CreateMap<User, DestinationViewModel>()
.ForMember(f => f.Score, m => m.MapFrom(s => s.anotherProperty));
我尝试在控制器动作中映射一个集合,如下所示:
var users = userService.GetPagedUsers(page, size, sort, direction);
var model = Mapper.Map<IPagedList<User>, IPagedList<DestinationViewModel>>(users);
首先,它甚至可以这样做吗?我在堆栈上有一个侦察员并没有找到明确的答案。到目前为止我没有运气我只收到InvalidCastOperations无法将User的通用集合映射到DestinationViewModel的pagedlist,这是由automapper抛出的。映射到模型时使用不同的列表类型(如IList),但我需要使用IPagedList接口来处理它所具有的所有分页内容。任何帮助都会非常感激,因此我的头发拉得太长了。
答案 0 :(得分:0)
在经过更多研究后结束找到答案,这是不行的,自动播放器不支持我的场景开箱即用。这里的两个选项是:自定义IObjectMapper,使用现有的Array / EnumerableMappers作为指南,或编写自定义TypeConverter。
答案 1 :(得分:0)
事实上,我相信这个问题有一个解决方案。
映射配置:
Mapper.CreateMap<User, DestinationViewModel>();
Mapper.CreateMap<PagedList<User>, PagedList<DestinationViewModel>>()
.AfterMap((s, d) => Mapper.Map<List<User>, List<DestinationViewModel>>(s, d));
然后在服务/控制器中:
var users = userService.GetPagedUsers(page, size, sort, direction);
var model = Mapper.Map<PagedList<User>, PagedList<DestinationViewModel>>(users);
我没有尝试过使用接口(IPagedList),只使用了实现(PagedList)。
答案 2 :(得分:0)
对于最近遇到问题的人,您可以使用自定义转换器来实现通用映射。根据{{3}}:
<块引用>AutoMapper 还支持具有任意数量的泛型参数的开放泛型类型转换器:
var configuration = new MapperConfiguration(cfg =>
cfg.CreateMap(typeof(Source<>), typeof(Destination<>)).ConvertUsing(typeof(Converter<,>)));
来自 Source
的封闭类型将是第一个泛型参数,而 Destination
的封闭类型将是关闭 Converter<,>
的第二个参数。
因此自定义类型转换器将是:
private class Converter<TSource, TDestination>
: ITypeConverter<PagedList<TSource>, PagedList<TDestination>>
{
public PagedList<TDestination> Convert(
PagedList<TSource> source,
PagedList<TDestination> destination,
ResolutionContext context) =>
new PagedList<TDestination>(
context.Mapper.Map<List<TSource>, List<TDestination>>(source));
/* Additional settings comes here. */
}
然后注册:
this.CreateMap(typeof(PagedList<>), typeof(PagedList<>)).ConvertUsing(typeof(Converter<,>));