向 CsvHelper.Configuration.ClassMap 对象添加验证(字符串)
Posted
技术标签:
【中文标题】向 CsvHelper.Configuration.ClassMap 对象添加验证(字符串)【英文标题】:Add validation to CsvHelper.Configuration.ClassMap object (string) 【发布时间】:2021-12-01 02:09:13 【问题描述】:我使用 CsvHelper.Configuration.ClassMap 读取 csv 文件并面临数据验证。
我找到了验证选项并写了一个简单的代码:
Map(m => m.Field).Name("myField").Validate(row => row.Contains('='));
但是我不理解输出并且对可能的选项有点困惑。
所以,我的问题是:
如果它返回 true - 我会收到字符串吗?还是布尔真?之后我想将值添加到 DB..
如果它返回 false - 我会收到什么?而且,无论如何,该值不会添加到DB中?
任何想法如何添加简单的验证?普通代码,未经验证:
Map(m => m.Field).Name("myField");
提前谢谢你!
【问题讨论】:
【参考方案1】:您可以使用 CsvHelper 27.1.1 以这种方式编写它
Map(m => m.Field).Name("myField").Validate(x => x.Field.Contains('='));
在 15.0.3 中你不会使用 Field
Map(m => m.Field).Name("myField").Validate(x => x.Contains("="));
验证函数具有以下签名:
public virtual MemberMap<TClass, TMember> Validate(Validate validateExpression);
验证类型是这样声明的委托:
public delegate bool Validate(ValidateArgs args);
ValidateArgs 具有我在代码示例中使用的属性 Field。
如果在转换过程中条件为假,则会抛出 FieldValidationException。
您可以捕获此异常并添加一些逻辑。
-
如果为 true,则转换将按预期进行,您的字段将被映射。
将引发 FieldValidationException。
参见上面的代码。
【讨论】:
你能解释一下“x => x.Field.Contains('=')”和“row => row.Contains('=')”之间的区别吗?有什么改变吗? 您使用的是什么版本的 CsvHelper?因为我无法按照您的方式使用它,因为它根本无法在 27.1.1 中编译。 15.0.3.它已经过时了,但我不想升级它。对解决方案有影响吗? 有趣的细节:抛出了 FieldValidationException,而不是 HeaderValidationException。仅供参考 你是对的,它是 FieldValidationException 而不是 HeaderValidationException 我会纠正这个。以上是关于向 CsvHelper.Configuration.ClassMap 对象添加验证(字符串)的主要内容,如果未能解决你的问题,请参考以下文章