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

MemberList.Source未对未映射的A.a4属性抛出异常问题

问题原因与解决办法

让我来帮你理清这个问题的核心所在,以及对应的解决思路:

原因分析

AutoMapper的配置规则验证(比如你指定的MemberList.Source要求)默认不会自动执行,必须显式触发才能检查所有映射是否符合预期。你当前的代码只创建了配置和映射器,但没有执行验证步骤,所以A类的a4属性未映射的问题没有被检测出来。

至于移除C映射中的.ForSourceMember(src => src.c2, opt => opt.DoNotValidate())后会抛出异常,是因为AutoMapper在首次执行嵌套映射时,可能会对嵌套的映射规则进行部分验证,但这种验证是不完整的,只会覆盖到嵌套层级的成员(比如C的c2),而顶层A类的a4问题则被遗漏了。

解决办法

1. 触发完整的配置验证

在创建映射器之前,调用config.AssertConfigurationIsValid()方法,这会让AutoMapper严格检查所有映射规则,包括顶层类的未映射成员。此时A的a4因为既没有同名目标成员、也没有自定义映射、也没有被显式忽略,就会抛出符合你第4个目标的异常。

2. 调整配置(按需选择)

如果你希望严格遵守第4个目标,保持当前A的映射配置不变即可,验证时会自动抛出异常。如果后续需要忽略某个源成员(比如临时需求),可以给A的映射添加显式忽略:

cfg.CreateMap<A, A_DTO>(MemberList.Source)
   .ForSourceMember(src => src.a4, opt => opt.DoNotValidate());

修改后的完整代码示例

var config = new MapperConfiguration( cfg => {
    cfg.CreateMap<A, A_DTO>(MemberList.Source);
    cfg.CreateMap<B, B_DTO>(MemberList.Source)
        .ForMember(dest => dest.b1x, opt => opt.MapFrom(src => src.b1));
    cfg.CreateMap<C, C_DTO>(MemberList.Source)
        .ForSourceMember(src => src.c2, opt => opt.DoNotValidate());
} );

// 关键步骤:触发完整配置验证
config.AssertConfigurationIsValid();

var mapper = config.CreateMapper();
A a = new A() { a1 = 1, a2 = 2, a3 = 3, a4 = 10, b = new B { b1 = 4, b2 = 5, c = new C { c1 = 6, c2 = 7 } } };
A_DTO aDto = new A_DTO();
mapper.Map(a, aDto);

这样调整后,当执行config.AssertConfigurationIsValid()时,AutoMapper就会检测到A的a4未被映射,抛出异常,完全满足你的所有目标要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:26:49