Mapster映射异常:字符串列表无法转换为RolesViewModel列表
解决Mapster映射字符串列表到RolesViewModel列表的类型转换错误
这个问题我之前也碰到过!本质是Mapster不知道怎么把单个字符串转换成你的RolesViewModel对象——毕竟一个是纯字符串,一个是带属性的类,默认没有这种转换规则,所以才会抛出Invalid cast from 'System.String' to 'ViewModel...'的错误。下面给你两种靠谱的解决方法:
1. 全局配置单个类型的映射规则
先定义好你的模型:
// 服务模型 public class ServiceModel { public List<string> Roles { get; set; } } // 视图模型 public class RolesViewModel { public string RoleName { get; set; } } // 对应的顶层视图模型(假设你需要把ServiceModel映射到这个) public class UserViewModel { public List<RolesViewModel> Roles { get; set; } }
然后在项目的启动配置(比如Program.cs或Startup.cs)里,给Mapster添加全局映射规则,告诉它怎么把string转成RolesViewModel:
// 配置string到RolesViewModel的转换逻辑 TypeAdapterConfig<string, RolesViewModel>.NewConfig() .Map(dest => dest.RoleName, src => src); // 可选:直接配置ServiceModel到UserViewModel的完整映射(上面的单个配置已经能覆盖集合转换) TypeAdapterConfig<ServiceModel, UserViewModel>.NewConfig();
之后在控制器里直接用Adapt方法就可以正常映射了:
var serviceData = _yourService.GetServiceModel(); // 获取你的服务模型实例 var viewModel = serviceData.Adapt<UserViewModel>();
2. 映射时临时指定集合转换逻辑
如果不想加全局配置,也可以在每次映射的时候,针对集合字段单独指定转换逻辑:
var serviceData = _yourService.GetServiceModel(); var viewModel = serviceData.Adapt<UserViewModel>(config => config.Map(dest => dest.Roles, src => src.Roles.Select(role => new RolesViewModel { RoleName = role })));
为什么会报错?
Mapster默认会尝试把源集合中的每个元素直接转换为目标集合的元素类型。这里源集合是List<string>,目标集合是List<RolesViewModel>,Mapster找不到string到RolesViewModel的默认转换规则,就会尝试强制类型转换,自然就抛出了类型不匹配的错误。我们的核心操作就是给Mapster补上这个转换规则。
内容的提问来源于stack exchange,提问作者j9070749
相关产品推荐
相关产品推荐

