C# CsvHelper Configuration.ShouldQuote-仅对DTO上的字符串字段返回true

C# CsvHelper Configuration.ShouldQuote-仅对DTO上的字符串字段返回true,c#,nuget,csvhelper,C#,Nuget,Csvhelper,Hi具有一个DTO对象,该对象具有许多不同类型的属性,string、int或bool等 我只想在字符串属性周围加上双引号 在配置中.ShouldQuote字段参数值都已转换为字符串,因此无法知道DTO的原始类型是字符串、int还是bool 是否有一种方法可以从DTO中找到基础属性类型,以便我可以从配置中传回true。应该仅对最初类型为string的字段引用 public class TestDTO { public string Field1 { get; set; } publ

Hi具有一个DTO对象,该对象具有许多不同类型的属性,
string
int
bool

我只想在
字符串
属性周围加上双引号

配置中.ShouldQuote
字段参数值都已转换为
字符串
,因此无法知道DTO的原始类型是
字符串
int
还是
bool

是否有一种方法可以从DTO中找到基础属性类型,以便我可以从
配置中传回
true
。应该仅对最初类型为
string
的字段引用

public class TestDTO
{
    public string Field1 { get; set; }
    public int Field2 { get; set; }
    public bool Field3 { get; set; }
}
csv.Configuration.ShouldQuote=(字段,上下文)=>
{
var index=context.Record.Count;
变量类型=((PropertyInfo)context.WriterConfiguration.Maps.Find().MemberMaps[index].Data.Member).PropertyType;
if(type==typeof(string))
{
返回true;
}
返回ConfigurationFunctions.ShouldQuote(字段、上下文);
};
也可以使用自定义转换器

公共类QuoteStringConverter:StringConverter
{
公共重写字符串ConvertToString(对象值,IWriterRow行,MemberMapData MemberMapData)
{
var innerQuotes=((字符串)值).Replace(row.Configuration.QuoteString,row.Configuration.DoubleQuoteString);
var quotedValue=row.Configuration.Quote+innerQuotes+row.Configuration.Quote;
返回base.ConvertToString(quotedValue、行、memberMapData);
}
}
关闭引号并将转换器添加到
TypeConverterCache

var rawData=new[]
{
新的TestDTO{Field1=“Field1”,Field2=1,Field3=true},
新TestDTO{Field1=“Field2”,Field2=10,Field3=false}
};
使用(var writer=newstreamwriter(“file.csv”))
使用(var csv=新csv编写器(编写器))
{
csv.Configuration.ShouldQuote=(字段,上下文)=>false;
csv.Configuration.TypeConverterCache.AddConverter(新的QuoteStringConverter());
csv.WriterRecords(原始数据);
}        

为什么要这样?CSV文件是一个文本文件。就CSV格式而言,所有字段都是文本。引用并没有说明内容。非美国区域性中的CSV文件可以使用
作为字段分隔符,并通过引用所有十进制字段来处理逗号作为十进制分隔符,例如
“3,14”
。另一个文件可以引用所有字段您是否试图强制Excel将某些字段视为文本,而将某些字段视为整数?在这种情况下,最好使用eg Epplus创建一个真正的Excel文件
    var rawData = new[]
    {
        new TestDTO { Field1 = "Field1", Field2 = 1, Field3 = true },
        new TestDTO { Field1 = "Field2", Field2 = 10, Field3 = false }
    };
    using (var writer = new StreamWriter("file.csv"))
    {
        using (var csv = new CsvWriter(writer))
        {
            csv.Configuration.ShouldQuote = (field, context) =>
            {
                return field is string; // doesn't work as all fields at this point are strings
            };

            csv.WriteRecords(rawData);
        }
    }