C# CSV帮助程序无法转换布尔值

C# CSV帮助程序无法转换布尔值,c#,.net-4.0,csvhelper,C#,.net 4.0,Csvhelper,我开始使用-一个很好的小帮手为您的日常工作-伟大的东西 我现在正在努力解决的一个问题是类地图——我有一个小类 public class SimpleClass { public int ID { get; set; } public string Name { get; set; } public decimal Percentage { get; set; } public bool IsValid { get; set; } } 对于导出到CSV,我想将Is

我开始使用-一个很好的小帮手为您的日常工作-伟大的东西

我现在正在努力解决的一个问题是类地图——我有一个小类

public class SimpleClass
{
    public int ID { get; set; }
    public string Name { get; set; }
    public decimal Percentage { get; set; }
    public bool IsValid { get; set; }
}
对于导出到CSV,我想将
IsValid
true
替换为
yes
False
替换为
no
;为此,我创建了一个类映射:

public class SimpleClassMap : CsvClassMap<SimpleClass>
{
    public override void CreateMap()
    {
        Map(x => x.ID).Index(0);
        Map(x => x.Name).Index(1);
        Map(x => x.Percentage).Index(2);
        Map(x => x.IsValid).Index(3)
                           .TypeConverterOption(true, "yes")
                           .TypeConverterOption(false, "no");
    }
}
CsvConfiguration config = new CsvConfiguration { Delimiter = ";", HasHeaderRecord = false, Quote = '"' };
config.RegisterClassMap<SimpleClassMap>();

using (MemoryStream stm = new MemoryStream())
using (var streamWriter = new StreamWriter(stm))
using (var csvWriter = new CsvWriter(streamWriter, config))
{
    csvWriter.WriteRecords(list);
    streamWriter.Flush();
}
公共类SimpleClassMap:CsvClassMap
{
public override void CreateMap()
{
Map(x=>x.ID).Index(0);
Map(x=>x.Name).Index(1);
Map(x=>x.Percentage)指数(2);
映射(x=>x.IsValid)。索引(3)
.TypeConverterOption(真,“是”)
.TypeConverterOption(假,“否”);
}
}
现在在导出数据时,我使用的是类映射:

public class SimpleClassMap : CsvClassMap<SimpleClass>
{
    public override void CreateMap()
    {
        Map(x => x.ID).Index(0);
        Map(x => x.Name).Index(1);
        Map(x => x.Percentage).Index(2);
        Map(x => x.IsValid).Index(3)
                           .TypeConverterOption(true, "yes")
                           .TypeConverterOption(false, "no");
    }
}
CsvConfiguration config = new CsvConfiguration { Delimiter = ";", HasHeaderRecord = false, Quote = '"' };
config.RegisterClassMap<SimpleClassMap>();

using (MemoryStream stm = new MemoryStream())
using (var streamWriter = new StreamWriter(stm))
using (var csvWriter = new CsvWriter(streamWriter, config))
{
    csvWriter.WriteRecords(list);
    streamWriter.Flush();
}
CsvConfiguration config=new CsvConfiguration{Delimiter=“;”,HasHeaderRecord=false,Quote='''};
config.RegisterClassMap();
使用(MemoryStream stm=new MemoryStream())
使用(var streamWriter=新streamWriter(stm))
使用(var csvWriter=new csvWriter(streamWriter,config))
{
csvWriter.WriterRecords(列表);
streamWriter.Flush();
}
不幸的是,当我检查所写的内容时,我发现我仍然得到
True
False
——而不是我所希望的
yes
no


我这里缺少什么?我使用的是从NuGet和.NET 4.0/Visual Studio 2010安装的CSV Helper v2.5。

类型转换器选项的布尔值重载仅在读取时使用。它允许您在读取时指定可用于真/假的多个值。因此,您可以执行
1
真“
“TRUE”
“TRUE”
“yes”
,等等

目前,编写时唯一的方法是创建自定义类型转换器

public class MyBooleanConverter : DefaultTypeConverter
{
    public override string ConvertToString( TypeConverterOptions options, object value )
    {
        if( value == null )
        {
            return string.Empty;
        }

        var boolValue = (bool)value;

        return boolValue ? "yes" : "no";
    }
}
然后,您可以将其应用于全局所有布尔值

CsvHelper.TypeConversion.TypeConverterFactory.AddConverter<bool>( new MyBooleanConverter() );
CsvHelper.TypeConversion.TypeConverterFactory.AddConverter(新的MyBooleanConverter());
或者通过映射将其应用于单个属性

Map( m => m.MyBoolProperty ).TypeConverter<MyBooleanConverter>();
Map(m=>m.MyBoolProperty).TypeConverter();

接受的解决方案不适用于最新版本。我正在使用
csvhelper15.0.0
,它就是这样工作的

public class MyBooleanConverter : DefaultTypeConverter
{
    public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        if( value == null )
        {
            return string.Empty;
        }
        var boolValue = (bool)value;
        return boolValue ? "yes" : "no";
    }
}
适用于单一财产:

Map(x => x.IsValid).Index(3).TypeConverter<MyBooleanConverter>();
Map(x=>x.IsValid).Index(3).TypeConverter();
从读写器的配置应用:

using var csvWriter = new CsvWriter(new StreamWriter(path), CultureInfo.InvariantCulture);
csvWriter.Configuration.TypeConverterCache.AddConverter<bool>(new MyBooleanConverter());
csvWriter.WriteRecords(data);
使用var csvWriter=new csvWriter(new StreamWriter(path),CultureInfo.InvariantCulture);
csvWriter.Configuration.TypeConverterCache.AddConverter(新的MyBooleanConverter());
CSV编写器写入记录(数据);

是的,我知道(下一个主要版本的配置将由读写器分开,而不是一个大的配置池。有没有办法将值传递给TypeConverter?我基本上想用指定长度的字符串替换任何空值(填充csv中的字段以满足规范要求)你能在github问题页面上发布这个吗?我们可以通过这种方式分享代码示例。