0

嗨,我在映射我创建的自定义分页列表集合时遇到了困难。

我有一个这样的 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 cannot map generic collection of User to DestinationViewModel,这是由 automapper 抛出的。在映射到模型时使用不同的列表类型(如 IList),但我需要对它拥有的所有分页内容使用 IPagedList 接口。任何帮助将不胜感激,因为我的头发拉得太长了。

4

3 回答 3

0

经过更多研究后最终找到了答案,这是不,自动映射器不支持我的场景开箱即用。这里的两个选项是:到自定义 IObjectMapper,使用现有的 Array/EnumerableMappers 作为指南,或者编写自定义 TypeConverter。

于 2013-07-18T12:58:54.640 回答
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)。

于 2014-02-13T11:41:46.167 回答
0

对于最近遇到问题的人,您可以使用自定义转换器实现通用映射。根据官方文档

AutoMapper 还支持具有任意数量的泛型参数的开放泛型类型转换器:

var configuration = new MapperConfiguration(cfg =>
  cfg.CreateMap(typeof(Source<>), typeof(Destination<>)).ConvertUsing(typeof(Converter<,>)));

from 的封闭类型Source将是第一个泛型参数,封闭类型 ofDestination将是 close 的第二个参数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<,>));
于 2021-06-16T08:51:38.003 回答