CsvHelper配置更新致现有代码编译报错,求修复方案
CsvHelper新版本配置变更编译错误的解决方法
问题背景
CsvHelper更新后,原代码中直接设置csv.Configuration的HasHeaderRecord、MissingFieldFound、BadDataFound属性的写法失效——这些配置成员被改为只读。改用CsvConfiguration实例配置时,碰到两个编译错误:
MissingFieldFound委托不接受3个参数BadDataFoundArgs不存在Row属性定义
错误原因
新版本CsvHelper调整了错误处理委托的签名,以及上下文参数的结构:
MissingFieldFound从原来的多参数委托改为仅接受MissingFieldFoundArgs类型的单个参数BadDataFoundArgs不再直接提供Row属性,行信息需要通过上下文的解析器获取
解决方法
1. 修正MissingFieldFound的委托写法
将原来的三个参数改为从MissingFieldFoundArgs实例中提取所需信息:
MissingFieldFound = args => AddMissingFieldParseError(args.FieldName, args.Context.Parser.Row, args.Index)
2. 修正BadDataFound的行信息获取方式
通过args.Context.Parser.Row获取当前行数据,替代原来的args.Row:
BadDataFound = args => AddBadDataFoundParseError(args.Field, args.Context.Parser.Row)
修改后的完整代码
配置实例代码
var config = new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = true, MissingFieldFound = args => AddMissingFieldParseError(args.FieldName, args.Context.Parser.Row, args.Index), BadDataFound = args => AddBadDataFoundParseError(args.Field, args.Context.Parser.Row) };
完整使用代码
DataTable dataTable = null; this._csvHeaders = null; using (reader) { using (var csv = new CsvReader(reader, config)) { using (var dataReader = new CsvDataReader(csv)) { // 校验表头 this._csvHeaders = csv.Context.Reader.HeaderRecord.ToList(); TrimHeaderNames(ref _csvHeaders); string errorMessage = string.Empty; if (!ValidateHeaders(_csvHeaders, out errorMessage)) { var operationError = new XOperationError("发现重复错误", errorMessage); this.ParseErrors.Clear(); this.ParseErrors.Add(0, new List<XOperationError> { operationError }); return null; } dataTable = new DataTable(); dataTable.Load(dataReader); } } }
内容的提问来源于stack exchange,提问作者T. J. Fan
相关产品推荐
相关产品推荐

