CsvHelper配置Convert转换逻辑后Validate验证不触发的问题咨询
问题根因
CsvHelper的字段映射处理流程中,一旦为字段显式定义了自定义Convert转换逻辑,框架会直接跳过内置的字段读取、验证、默认类型转换流程,完全以Convert方法的返回值作为字段赋值结果,因此预先配置的Validate规则不会被触发,这是框架的设计行为,并非BUG。
解决方案
推荐直接将验证逻辑迁移到Convert方法内部执行,既符合框架的执行逻辑,也无需修改原有映射结构,修改后的示例代码如下:
Map(m => m.ProjectStock) .Convert(args => { var projectStock = args.Row.GetField("ProjectStock"); // 先执行原有验证逻辑 if (!csvMapHelper.TrueStringsList.Contains(projectStock) && !csvMapHelper.FalseStringList.Contains(projectStock)) { // 抛出字段验证异常,和CsvHelper内置验证抛出的异常类型保持一致即可,也可自定义业务异常 throw new FieldValidationException(args.Context, args.Row, "ProjectStock字段值不在合法的真假值列表范围内"); } // 验证通过后执行转换逻辑 return csvMapHelper.TrueStringsList.Contains(projectStock); });
如果不想调整现有代码结构,也可以升级CsvHelper到27.0及以上版本,使用新增的支持验证后执行转换的API,不过兼容性不如上述方案。
内容的提问来源于stack exchange,提问作者mileski
相关产品推荐
相关产品推荐

