如何使用Mapster将SqlUser的Id属性映射至User的UserId属性?
Mapster 属性名不一致的自动映射及配置传入问题
一、实现自动映射的方式
因为SqlUser的Id和User的UserId属性名不匹配,Mapster默认无法自动识别,有两种可行的自动映射方案:
1. 全局约定配置
通过全局配置设置属性名匹配规则,让Mapster自动识别类似Id与[类名]Id的属性映射关系:
// 启用大小写忽略+包含匹配的策略 TypeAdapterConfig.GlobalSettings.Default.NameMatchingStrategy(NameMatchingStrategy.IgnoreCase | NameMatchingStrategy.Contains); // 或者自定义更精准的匹配逻辑,专门处理Id到[目标类名]Id的映射 TypeAdapterConfig.GlobalSettings.Default.NameMatchingStrategy((sourceName, destName) => { if (sourceName == "Id" && destName.EndsWith("Id")) return true; return NameMatchingStrategy.IgnoreCase(sourceName, destName); });
2. 局部类映射配置
针对SqlUser和User单独配置映射规则,这种方式更精准,不会影响其他类的映射逻辑:
var config = TypeAdapterConfig<SqlUser, User>.NewConfig() .Map(dest => dest.UserId, src => src.Id); // 使用该配置完成映射 SqlUser sqlUser = new SqlUser { Id = 1 }; User user = sqlUser.Adapt<User>(config);
二、将泛型TypeAdapterConfiguration<T,U>传入非泛型Adapt方法
泛型的TypeAdapterConfiguration<T,U>本身继承自非泛型的TypeAdapterConfiguration类,因此可以直接将泛型配置对象强制转换为非泛型类型传入Adapt方法,示例如下:
// 创建泛型映射配置 var genericConfig = TypeAdapterConfig<SqlUser, User>.NewConfig() .Map(dest => dest.UserId, src => src.Id); // 强制转换为非泛型配置后传入Adapt方法 SqlUser sqlUser = new SqlUser { Id = 2 }; User user = sqlUser.Adapt<User>((TypeAdapterConfiguration)genericConfig);
另外,也可以将泛型配置注册到全局配置中,之后直接使用无参数的Adapt方法:
// 将配置注册到全局 TypeAdapterConfig<SqlUser, User>.NewConfig() .Map(dest => dest.UserId, src => src.Id) .Register(); // 直接调用Adapt完成映射 var user = sqlUser.Adapt<User>();
内容的提问来源于stack exchange,提问作者Dmitry Arestov
相关产品推荐
相关产品推荐

