CsvHelper 27.2.1是否不支持写入C# record类型到CSV文件?
CsvHelper写入C# record类型异常问题解答
结论:你无法判定CsvHelper 27.2.1版本不支持C# record类型,你遇到的报错和record类型本身无关,核心是你的Traffic record包含IPAddress类型属性,CsvHelper默认没有内置该类型的转换器,导致写入时触发异常。
你可以通过简单测试验证:定义一个仅包含string、int等基础类型的record,用原写入逻辑执行,完全可以正常生成CSV文件。
解决方案
方案1:自定义IPAddress类型转换器
自己实现IPAddress的转换逻辑,在写入前注册到CsvHelper即可,代码如下:
using CsvHelper; using CsvHelper.Configuration; using CsvHelper.TypeConversion; using System.Globalization; using System.Net; public class IPAddressConverter : DefaultTypeConverter { // 写入CSV时的转换逻辑 public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) { return value is IPAddress ip ? ip.ToString() : string.Empty; } // 读取CSV时的转换逻辑,不需要读取可以不实现 public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData) { return IPAddress.TryParse(text, out var ip) ? ip : IPAddress.None; } }
修改你的写入代码,提前注册转换器:
var all = new List<Traffic>(); // 填充集合逻辑不变 using var writer = new StreamWriter("file.csv"); using var csv = new CsvHelper.CsvWriter(writer, CultureInfo.InvariantCulture); // 注册自定义的IPAddress转换器 csv.Context.TypeConverterCache.AddConverter<IPAddress>(new IPAddressConverter()); csv.WriteRecords(all);
方案2:调整属性类型
将Traffic record中的SrcIp、DestIp属性改为string类型,在填充集合的逻辑中提前调用ToString()将IPAddress转为字符串,也可以直接解决问题。
关于转换为class后写入成功的说明
你转换为class后写入成功的原因是你在class构造或赋值过程中已经将IPAddress类型转为了string类型,避开了类型转换失败的问题,和使用class还是record类型无关。
内容的提问来源于stack exchange,提问作者anonmous
相关产品推荐
相关产品推荐

