AutoMapper:如何在运行时读取映射配置?
运行时读取AutoMapper映射配置的实用方法
没问题,刚接触AutoMapper有疑问太正常啦~针对你已经创建的IDataReader到PersonDto的映射,想在运行时读取这些配置的需求,我给你整理了几种可行的方案:
1. 通过已初始化的IMapper实例获取配置
如果你已经拿到了IMapper的实例(比如依赖注入获取的),可以通过它的ConfigurationProvider属性访问全局映射配置,进而定位到你需要的具体映射:
// 假设你已经有IMapper实例mapper var configProvider = mapper.ConfigurationProvider; // 精准获取IDataReader到PersonDto的映射配置 var typeMap = configProvider.FindTypeMapFor<IDataReader, PersonDto>(); // 遍历所有成员映射,查看详细配置 if (typeMap != null) { foreach (var propertyMap in typeMap.GetPropertyMaps()) { // 目标属性名称(比如FirstName、LastName) var targetProp = propertyMap.DestinationMember.Name; // 对应的源映射逻辑:如果是自定义MapFrom,会返回表达式字符串 var sourceLogic = propertyMap.CustomMapExpression?.ToString() ?? propertyMap.SourceMember?.Name; Console.WriteLine($"目标属性: {targetProp} | 源映射规则: {sourceLogic}"); } }
2. 直接从MapperConfiguration实例读取
如果是你手动构建的MapperConfiguration(比如在项目启动时配置的),可以直接用这个实例查询映射细节:
// 假设你的MapperConfiguration是这样创建的 var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<IDataReader, PersonDto>() .ForMember(o => o.FirstName, opt => opt.MapFrom(row => row["First Name"])) .ForMember(o => o.LastName, opt => opt.MapFrom(row => row["Last Name"])); }); // 获取指定类型对的映射 var typeMap = mapperConfig.FindTypeMapFor<IDataReader, PersonDto>(); // 输出映射详情 if (typeMap != null) { foreach (var propMap in typeMap.PropertyMaps) { Console.WriteLine($"目标字段: {propMap.DestinationName}"); Console.WriteLine($"关联源: {propMap.CustomMapExpression ?? propMap.SourceMember?.Name}"); } }
3. 额外小技巧:验证映射配置有效性
如果你想确认自己的映射配置有没有遗漏或错误,可以用AssertConfigurationIsValid()方法做校验,它会在配置有问题时抛出异常并给出明确提示:
// 对MapperConfiguration实例执行校验 mapperConfig.AssertConfigurationIsValid(); // 或者通过IMapper实例执行 mapper.ConfigurationProvider.AssertConfigurationIsValid();
小贴士:对于你示例里这种用
row["First Name"]的自定义映射逻辑,CustomMapExpression会返回对应的表达式树字符串,虽然不是完全和你写的代码一致,但能清晰看到目标属性和源数据的关联关系。
内容的提问来源于stack exchange,提问作者Walter Stabosz
相关产品推荐
相关产品推荐

