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

如何在AutoMapper中为多个映射表达式统一应用无重复条件

优化AutoMapper重复条件配置的几种方案

方案1:提取公共条件委托

把重复的非空判断逻辑提取为可复用的委托,避免每次重复编写Lambda表达式:

public class MappingConfig
{
    // 提取公共的非空成员条件委托
    private static readonly Func<object, object, object, bool> _nonNullMemberCondition = 
        (src, dest, srcMember) => srcMember != null;

    public static MapperConfiguration RegisterMaps()
    {
        return new MapperConfiguration(config =>
        {
            config.CreateMap<PermissaoEntity, PermissaoVO>()
                  .ReverseMap()
                  .ForAllMembers(o => o.Condition(_nonNullMemberCondition));
            
            config.CreateMap<SystemCategoria, CategoriaVO>()
                  .ReverseMap()
                  .ForAllMembers(o => o.Condition(_nonNullMemberCondition));
        });
    }
}

方案2:封装扩展方法(更简洁)

如果有大量映射需要添加该条件,可封装扩展方法,将CreateMap+ReverseMap+ForAllMembers的逻辑打包:

// 定义AutoMapper扩展类
public static class AutoMapperExtensions
{
    public static IMappingExpression<TSource, TDestination> CreateMapWithNonNullCondition<TSource, TDestination>(this IMapperConfigurationExpression config)
    {
        return config.CreateMap<TSource, TDestination>()
                     .ReverseMap()
                     .ForAllMembers(o => o.Condition((src, dest, srcMember) => srcMember != null));
    }
}

// 配置类中使用扩展方法
public class MappingConfig
{
    public static MapperConfiguration RegisterMaps()
    {
        return new MapperConfiguration(config =>
        {
            config.CreateMapWithNonNullCondition<PermissaoEntity, PermissaoVO>();
            config.CreateMapWithNonNullCondition<SystemCategoria, CategoriaVO>();
            // 其他映射直接一行搞定
        });
    }
}

方案3:全局配置(谨慎使用)

如果所有映射都需要这个非空覆盖逻辑,可直接全局配置,无需逐个映射添加:

public class MappingConfig
{
    public static MapperConfiguration RegisterMaps()
    {
        return new MapperConfiguration(config =>
        {
            // 全局应用非空成员条件
            config.ForAllMaps((map, exp) =>
            {
                exp.ForAllMembers(o => o.Condition((src, dest, srcMember) => srcMember != null));
                // 同时处理反向映射
                if (map.ReverseMap != null)
                {
                    map.ReverseMap.ForAllMembers(o => o.Condition((src, dest, srcMember) => srcMember != null));
                }
            });

            // 只需定义映射,无需额外加条件
            config.CreateMap<PermissaoEntity, PermissaoVO>().ReverseMap();
            config.CreateMap<SystemCategoria, CategoriaVO>().ReverseMap();
        });
    }
}

注意:全局配置会影响所有映射,若部分映射不需要该逻辑,建议使用前两种方案。

内容的提问来源于stack exchange,提问作者Guilherme Mohr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 20:57:13