You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:05:22