Automapper中TMember未返回预期值的技术问题
AutoMapper中TMember参数无法获取预期值的问题
模型
public class NodeInfo { public double X { get; set; } } public class NetNode { public double X { get; set; } }
问题描述
针对上述模型,我配置了映射规则:假设源对象NodeInfo的X属性值为5,预期MapFrom中的TMember参数o的值为5,但实际始终返回0。若改为返回s.X则能正常得到5,我原本认为TMember应该返回对应属性的值。
映射配置类
public class ProfileBase : Profile { public ProfileBase() { CreateMap<NodeInfo, NetNode>() .ForMember(n => n.X, opt => opt.MapFrom((s, d, o, ctx) => o)).ReverseMap(); } }
使用的MapFrom重载
IMemberConfigurationExpression<TSource, TDestination, TMember> MapFrom<TResult>(Func<TSource, TDestination, TMember, ResolutionContext, TResult> mappingFunction);
执行代码
var config = new MapperConfiguration(cfg => { cfg.AddProfile(new ProfileBase()); }); IMapper mapper = config.CreateMapper(); NodeInfo nodeInfo = new() { X = 5 }; NetNode netNode; netNode = mapper.Map<NetNode>(nodeInfo); // netNode.X应为5但实际为0 // 将配置中的=> o改为=> s.X则返回5
问题解答
你误解了这个MapFrom重载里TMember类型参数的作用:它代表的是目标对象当前成员的初始值,而非源对象对应属性的值。
在执行mapper.Map<NetNode>(nodeInfo)时,AutoMapper会新建一个NetNode实例,此时它的X属性是double类型的默认值0,所以映射逻辑里的o参数拿到的就是这个初始值,而非源对象nodeInfo.X的5。
如果要获取源对象的属性值,必须通过参数s(源实例)访问s.X,这也是你测试中能得到正确结果的原因。
额外说明:如果源和目标的属性名、数据类型完全一致(比如这里的X属性),AutoMapper会自动完成映射,不需要手动配置ForMember。
内容的提问来源于stack exchange,提问作者Emre Utku Solak
相关产品推荐
相关产品推荐

