如何通过AutoMapper自定义转换逻辑实现多语言属性映射?
用AutoMapper实现自定义本地化属性映射
当然可以实现这种自定义转换逻辑,下面提供两种可行的方案:
方案一:针对单个属性手动配置映射
如果仅需处理个别属性(比如示例中的Name),直接在映射配置里指定解析逻辑即可:
var configuration = new MapperConfiguration(cfg => { cfg.CreateMap<Source, Destination>() .ForMember(dest => dest.Name, opt => opt.ResolveUsing(src => new LocalizedString { Fr = src.NameFr, Nl = src.NameNl })); }); // 验证配置合法性 configuration.AssertConfigurationIsValid(); // 执行映射 var mapper = configuration.CreateMapper(); var source = new Source { NameFr = "Nom", NameNl = "Naam" }; var destination = mapper.Map<Destination>(source);
方案二:全局通用映射规则(适配所有LocalizedString类型属性)
如果需要让所有名为Foo的LocalizedString类型目标属性,自动匹配源对象的FooFr和FooNl属性,可以通过自定义值解析器结合反射实现通用逻辑:
1. 自定义值解析器
public class LocalizedStringResolver : IValueResolver<object, object, LocalizedString> { public LocalizedString Resolve(object source, object destination, LocalizedString destMember, ResolutionContext context) { // 获取当前映射的目标属性名(如"Name") var targetPropertyName = context.MemberName; // 反射获取源对象对应的Fr、Nl属性 var frProperty = source.GetType().GetProperty($"{targetPropertyName}Fr"); var nlProperty = source.GetType().GetProperty($"{targetPropertyName}Nl"); if (frProperty == null || nlProperty == null) return null; return new LocalizedString { Fr = frProperty.GetValue(source) as string, Nl = nlProperty.GetValue(source) as string }; } }
2. 配置全局映射规则
var configuration = new MapperConfiguration(cfg => { // 为所有LocalizedString类型属性应用自定义解析器 cfg.CreateMap<object, LocalizedString>().ConvertUsing<LocalizedStringResolver>(); // 配置Source到Destination的基础映射(无需单独配置Name属性) cfg.CreateMap<Source, Destination>(); }); configuration.AssertConfigurationIsValid(); // 执行映射示例 var mapper = configuration.CreateMapper(); var source = new Source { NameFr = "Bonjour", NameNl = "Hallo" }; var destination = mapper.Map<Destination>(source);
注意事项
- 确保源对象中存在对应的
[PropertyName]Fr和[PropertyName]Nl属性,否则解析器会返回null - 反射实现的通用方案性能略低于手动配置,若对性能要求极高,建议优先使用方案一
- 可通过
configuration.AssertConfigurationIsValid()提前验证映射配置是否存在未匹配的属性
内容的提问来源于stack exchange,提问作者ssougnez
相关产品推荐
相关产品推荐

