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

AutoMapper中使用ForAllMembers时如何获取源成员类型

解决AutoMapper高版本ForAllMembers中获取源成员类型的问题

核心实现思路

  • 通过AutoMapper的TypeMap存储的源-目标成员映射关系获取源成员元数据,无需依赖运行时的成员值
  • 直接读取源属性定义的类型判断可空性,规避值装箱导致的类型丢失问题

完整实现代码

using System.Reflection;
using AutoMapper;

public MapperConfiguration CreateMapperConfiguration<TSource, TDestination>()
{
    return new MapperConfiguration(cfg =>
    {
        // 创建映射同时获取类型映射元数据
        var mapBuilder = cfg.CreateMap<TSource, TDestination>();
        var typeMap = mapBuilder.TypeMap;

        mapBuilder.ForAllMembers(memberOptions =>
        {
            // 先匹配当前目标成员对应的属性映射
            var propertyMap = typeMap.PropertyMaps
                .FirstOrDefault(pm => pm.DestinationMember == memberOptions.DestinationMember);
            // 获取源成员的PropertyInfo
            var sourceProperty = propertyMap?.SourceMember as PropertyInfo;
            // 源成员类型(值为null时也可正常获取)
            Type sourceMemberType = sourceProperty?.PropertyType;

            memberOptions.Condition((source, destination, sourceMemberValue, destinationMemberValue, resolutionContext) =>
            {
                if (sourceMemberValue == null)
                {
                    // 直接使用提前获取的sourceMemberType处理对应逻辑即可
                }
                else
                {
                    // 判断源成员是否为可空值类型,直接判断属性定义的类型,不受装箱影响
                    bool isNullableValueType = Nullable.GetUnderlyingType(sourceMemberType) != null;
                    // 若需判断可空引用类型,可读取sourceProperty上的NullableAttribute元数据实现
                }                

                return true;
            });
        });

    });
}

适用版本

本方案兼容AutoMapper 5.x及以上所有正式版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:45:01