You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mapster无法映射继承泛型List的泛型类成员问题求助

解决Mapster映射自定义泛型集合类PagedList<T>的成员问题

问题分析

你的PagedList<T>继承自List<T>,Mapster默认会优先处理集合元素的映射,但不会自动识别并映射类中额外的自定义属性;另外你之前的IncludeMember配置逻辑错误——这些自定义属性都是public的,而你配置的是只包含internal/ProtectedInternal成员,所以该配置完全没作用。

可行解决方案

方案1:全局泛型配置(推荐,复用性强)

在应用启动时(比如Program.cs/Startup.cs)配置一次泛型映射规则,自动处理所有PagedList<TSource>到PagedList<TDestination>的映射:

// 全局配置,只需初始化一次
TypeAdapterConfig<PagedList<TSource>, PagedList<TDestination>>.NewConfig()
    // 手动映射自定义属性
    .Map(dest => dest.CurrentPage, src => src.CurrentPage)
    .Map(dest => dest.TotalPages, src => src.TotalPages)
    .Map(dest => dest.PageSize, src => src.PageSize)
    .Map(dest => dest.TotalCount, src => src.TotalCount);
  • 无需映射HasPrevious和HasNext:这两个是计算属性,会自动根据CurrentPage和TotalPages的值计算得出。
  • Mapster会自动处理List<T>元素的转换,无需额外配置集合元素的映射。

方案2:构造函数直接初始化(更直观)

利用PagedList<T>的带参构造函数,直接传入映射后的元素和原对象的分页参数:

// 可以全局配置,也可以在映射时使用(推荐全局配置)
TypeAdapterConfig<PagedList<User>, PagedList<UserDTO>>.NewConfig()
    .ConstructUsing(src => new PagedList<UserDTO>(
        src.Adapt<List<UserDTO>>(),
        src.TotalCount,
        src.CurrentPage,
        src.PageSize
    ));

之后在业务代码中直接调用Adapt即可:

PagedList<UserDTO> usersDTO = users.Adapt<PagedList<UserDTO>>();

注意事项

  • 不要在每次映射的方法内重复创建TypeAdapterConfig:全局配置只需初始化一次,重复创建会覆盖之前的规则,且影响性能。
  • 确保User到UserDTO的基础映射已经正确配置(如果有自定义规则的话),否则集合元素的映射会出错。

内容的提问来源于stack exchange,提问作者Peter Rundqvist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 05:50:37