如何在AutoMapper中处理缺失属性?避免对象被整体置空
解决AutoMapper映射XML缺失属性导致对象为空的问题
方案1:利用AutoMapper自动映射(推荐)
无需手动在MapFrom里实例化Person和PersonName,让AutoMapper自动处理字段映射即可。当XML中缺少某个属性时,对应字段会被设为null,而非整个PersonName对象为空。
先创建XMLData到PersonName的映射,再创建XMLData到Person的映射:
// 映射PersonName,对可能缺失的属性用null条件运算符安全访问 CreateMap<XMLData, PersonName>() .ForMember(dest => dest.PersonFirstName, opt => opt.MapFrom(src => src.PersonFirstName.Value)) .ForMember(dest => dest.PersonMiddleName, opt => opt.MapFrom(src => src.PersonMiddleName?.Value)) .ForMember(dest => dest.PersonLastName, opt => opt.MapFrom(src => src.PersonLastName.Value)) .ForMember(dest => dest.PersonSuffix, opt => opt.MapFrom(src => src.PersonSuffix?.Value)); // 映射Person,自动复用上面的PersonName映射规则 CreateMap<XMLData, Person>() .ForMember(dest => dest.PersonName, opt => opt.MapFrom(src => src));
方案2:改进手动实例化写法
如果坚持手动创建对象,需要给每个可能缺失的属性加上null条件判断,避免单个字段缺失导致整个PersonName无法创建:
CreateMap<XMLData, Person>() .ForMember(dest => dest.PersonName, opt => opt.MapFrom(src => new PersonName { PersonFirstName = src.PersonFirstName.Value, PersonMiddleName = src.PersonMiddleName?.Value, PersonLastName = src.PersonLastName.Value, PersonSuffix = src.PersonSuffix?.Value }));
问题根源说明
你直接访问src.PersonMiddleName.Value时,若XML中无该属性,src.PersonMiddleName为null,此时访问.Value会触发空引用异常,AutoMapper捕获异常后会将整个PersonName设为null。使用?.运算符可安全访问可能为null的属性,避免异常发生。
内容的提问来源于stack exchange,提问作者AJ M.
相关产品推荐
相关产品推荐

