C# CsvHelper Configuration.ShouldQuote-仅对DTO上的字符串字段返回true
Hi具有一个DTO对象,该对象具有许多不同类型的属性,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
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);
}
}