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
相关产品推荐
相关产品推荐

