我偶尔使用CsvReader;当通过 NuGet 从 v18 升级到最新的 v22 时,我发现了重大更改,但从 CsvReader 网站上不清楚如何修复重大更改。有谁知道如何在 CsvHelper v22 中提供等效功能来执行 v18 中的此代码:
using (var csv = new CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture))
{
csv.Configuration.RegisterClassMap<MyMap>(); //I believe this should now be csv.Context.RegisterClassMap<MyMap>();
csv.Configuration.HeaderValidated = null; //broken - no setter on IReaderConfiguration
csv.Configuration.MissingFieldFound = null; //broken - no setter on IReaderConfiguration
}
CsvHelper 网站、StackOverflow 和文档上的示例仍然引用旧的 v18 setter,所以我找不到解决方法。
它们是仅限初始化的属性,因此仍然可以在初始值设定项中设置它们:
var conf = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HeaderValidated = ... ,
MissingFieldFound = ...
};
using (var csv = new CsvHelper.CsvReader(reader, conf))
{
csv.Context.RegisterClassMap<SomeMap>();
}
还有一个巨大的构造函数,里面有很多选项,你可以把它们挑出来:
var conf = new CsvConfiguration(CultureInfo.InvariantCulture,
headerValidated: ...,
missingFieldFound: ...
);
构造函数签名似乎表明,如果使用此构造函数并且没有为它们指定任何内容,则默认情况下它们将最终为 null ..
..但是这个构造函数有一个最近的相关问题,因为无法提供null
来表示“不采取任何行动”,因为它是用于指示“未提供任何值”的默认值(而且我不确保可选委托是否可以是其他任何东西(tbh),因此您传入的任何
null
都会被有效忽略,并使用 ConfigurationFunctions.cs 中的默认函数..如果您想使用构造函数形式并希望出现“无操作”,建议的解决方法是提供“不执行任何操作”的委托:
var conf = new CsvConfiguration(CultureInfo.InvariantCulture,
headerValidated: (_,_) => { },
missingFieldFound: (_,_,_) => { }
);
我个人会使用初始化形式
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
MissingFieldFound = args =>
{
Console.WriteLine($"Missing field found at index {args.Index} with header '{args.HeaderNames}'");
}
};
using (var csv = new CsvReader(reader, config))
{
...
}