首页 > 解决方案 > CsvHelper 不验证是否设置了转换

问题描述

使用 CsvHelper 库,如果 Map 定义了 Convert ,则不会触发验证。

例子:

Map(m => m.ProjectStock)
                .Validate(x =>
                    csvMapHelper.TrueStringsList.Contains(x.Field) || csvMapHelper.FalseStringList.Contains(x.Field))
                .Convert(args =>
                {
                    var projectStock = args.Row.GetField("ProjectStock");
                    return csvMapHelper.TrueStringsList.Contains(projectStock);
                });

如果我运行此代码,则只有 Convert 触发,但 Validate 被跳过。

我究竟做错了什么?

标签: c#.netcsvcsvhelper

解决方案


我不确定为什么该Validate方法不会触发。但是,我相信有一种更简单的方法可以做你想做的事情。

void Main()
{
    using (var reader = new StringReader("Id,Name,ProjectStock\n1,Jordan,tak\n2,Beth,no"))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        csv.Context.TypeConverterOptionsCache.GetOptions<bool>().BooleanTrueValues.AddRange(CsvMapHelper.TrueStringsList);
        csv.Context.TypeConverterOptionsCache.GetOptions<bool>().BooleanFalseValues.AddRange(CsvMapHelper.FalseStringList);
        var records = csv.GetRecords<Foo>().ToList();
    }   
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool ProjectStock { get; set; }
}

public class CsvMapHelper
{
    public static List<string> TrueStringsList => new List<string> { "yes", "true", "tak" };
    public static List<string> FalseStringList => new List<string> { "no", "false", "nie" };    
}

推荐阅读