Mapster映射CultureInfo遇无默认构造函数,求MapWith以外的解决方案
解决方案
方案1:使用ConstructUsing构建目标实例
在Dto到Entity的映射配置中,通过ConstructUsing直接创建Entity实例并初始化CultureInfo,其余属性由Mapster自动匹配映射(Mapster支持同名属性自动映射,且默认处理string到Guid这类基本类型转换):
TypeAdapterConfig<Dto, Entity>.NewConfig() .ConstructUsing(dto => new Entity { CultureInfo = CultureInfo.GetCultureInfo(dto.CultureName) });
这种方式无需手动映射所有属性,仅针对性处理CultureInfo的初始化逻辑,其余属性会自动完成转换。
方案2:全局注册string与CultureInfo的类型转换器
如果项目中多处需要在string和CultureInfo之间转换,可全局配置类型转换规则,后续所有相关映射都会自动复用该规则:
// 全局注册string到CultureInfo的转换逻辑 TypeAdapterConfig<string, CultureInfo>.NewConfig() .MapWith(cultureName => CultureInfo.GetCultureInfo(cultureName)); // 全局注册CultureInfo到string的转换逻辑(对应Entity到Dto的映射) TypeAdapterConfig<CultureInfo, string>.NewConfig() .MapWith(cultureInfo => cultureInfo.Name);
完成全局配置后,原双向映射配置可简化(若属性名匹配甚至可省略显式配置):
// 仅当属性名不匹配时需显式指定,否则可省略 TypeAdapterConfig<Dto, Entity>.NewConfig() .Map(dest => dest.CultureInfo, src => src.CultureName); TypeAdapterConfig<Entity, Dto>.NewConfig() .Map(dest => dest.CultureName, src => src.CultureInfo);
这种方式的优势是一次配置全局生效,避免在多个类的映射中重复编写CultureInfo的转换逻辑。
内容的提问来源于stack exchange,提问作者coolboy
相关产品推荐
相关产品推荐

