You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:54:03