C#中使用AutoMapper自动映射ClassB到ClassC时如何解决属性报错?
解决方案
1. 直接映射同名属性(推荐,无需自定义逻辑时使用)
如果ExtraProperty只需从ClassB直接赋值到ClassC,在原有映射配置基础上明确指定该属性的映射即可(属性名完全一致时也可省略手动指定,AutoMapper会自动处理):
CreateMap<ClassB, ClassC>() // 将ClassB实例整体映射到ClassC的classA属性 .ForMember(c => c.classA, o => o.MapFrom(b => b)) // 直接映射ExtraProperty,属性名一致时此句可省略 .ForMember(c => c.ExtraProperty, o => o.MapFrom(b => b.ExtraProperty));
2. 手动自定义处理ExtraProperty
若需要对ExtraProperty做自定义逻辑处理(比如转换值、从其他来源取值),替换MapFrom中的逻辑即可:
// 示例自定义处理方法 private Guid CustomProcessExtraProperty(Guid sourceValue) { // 编写你的自定义逻辑,比如生成新Guid、格式转换等 return sourceValue; // 替换为实际处理结果 } // 映射配置 CreateMap<ClassB, ClassC>() .ForMember(c => c.classA, o => o.MapFrom(b => b)) // 用自定义逻辑处理ExtraProperty .ForMember(c => c.ExtraProperty, o => o.MapFrom(b => CustomProcessExtraProperty(b.ExtraProperty)));
3. 忽略ExtraProperty并关闭对应验证(无需映射该属性时使用)
如果不需要通过AutoMapper映射ExtraProperty,而是手动在映射后赋值,需要同时忽略目标属性映射并关闭对应验证:
CreateMap<ClassB, ClassC>() .ForMember(c => c.classA, o => o.MapFrom(b => b)) // 忽略ClassC的ExtraProperty,不通过AutoMapper映射 .ForMember(c => c.ExtraProperty, o => o.Ignore()) // 关闭成员列表验证,避免因未映射属性触发异常 .ValidateMemberList(MemberList.None);
也可以仅针对源属性关闭验证,精准避免AutoMapper检查ClassB的ExtraProperty是否被映射:
CreateMap<ClassB, ClassC>() .ForMember(c => c.classA, o => o.MapFrom(b => b)) .ForMember(c => c.ExtraProperty, o => o.Ignore()) // 不验证ClassB的ExtraProperty是否被映射 .ForSourceMember(b => b.ExtraProperty, o => o.DoNotValidate());
内容的提问来源于stack exchange,提问作者Baguji
相关产品推荐
相关产品推荐

