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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:15:44