自动映射自定义集合

时间:2013-07-17 22:15:02

标签: c# generics collections automapper

我很难映射我创建的自定义页面列表集合。

我有一个像这样的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接口来处理它所具有的所有分页内容。任何帮助都会非常感激,因此我的头发拉得太长了。

3 个答案:

答案 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<,>));