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
相关产品推荐
相关产品推荐

