【问题标题】:C# record type not supported?不支持 C# 记录类型?
【发布时间】:2022-01-03 20:18:10
【问题描述】:

用 C# record 定义为

public record Traffic(TrafficType Type, string Wan, string Lan, string Domain, string Org, IPAddress SrcIp, string SrcMac, IPAddress DestIp,
        string Protocol, string Scheme);

当我尝试通过

编写它们的集合时
var all = new List<Traffic>();
// ...populate all
using var writer = new StreamWriter("file.csv");
using var csv = new CsvHelper.CsvWriter(writer, CultureInfo.InvariantCulture);
csv.WriteRecords(all);

我收到以下消息的异常:

发生意外错误。 IWriter 状态: 行:1 索引:0
标题记录: 1

如果我将记录对象的集合转换为类对象的集合,那么它就成功了。 (尝试将record 实例传递给class 构造函数不起作用。我必须创建一个class 构造函数,该构造函数从record 实例中获取每个感兴趣的属性作为显式参数)

这是一个使用 CsvHelper 27.2.1 的 .NET Core 5.0 项目。

C#record 类型不受 CsvHelper 支持的结论是否正确?

谢谢。

【问题讨论】:

  • 记录是不可变的,我敢打赌 CsvHelper 正在使用某种形式的反射来更新对象属性,这就是您看到运行时错误的原因。

标签: c# csvhelper c#-9.0


【解决方案1】:

问题不在于record。问题是IPAddressAutoMap。如果你创建一个属性为IPAddress 的类,你会得到同样的错误。我不确定为什么AutoMap 会抛出异常,如果您手动映射所有属性,它工作正常。错误的内部异常是Value cannot be null. (Parameter 'source')

void Main()
{
    var all = new List<Traffic>()
    {
        new (TrafficType.Type1, "Wan1","Lan1","Domain1","Org1",IPAddress.Parse("192.168.0.1"), "SrcMac1",IPAddress.Parse("192.168.0.1"), "Protocol1", "Scheme1")
    };

    using var csv = new CsvHelper.CsvWriter(Console.Out, CultureInfo.InvariantCulture);
    
    csv.Context.RegisterClassMap<TrafficMap>();
          
    csv.WriteRecords(all);
}

public class TrafficMap : ClassMap<Traffic>
{
    public TrafficMap()
    {
        //AutoMap(CultureInfo.InvariantCulture); // This will throw an exception.
        Map(x => x.Type);
        Map(x => x.Wan);
        Map(x => x.Lan);
        Map(x => x.Domain);
        Map(x => x.Org);
        Map(x => x.SrcIp);
        Map(x => x.SrcMac);
        Map(x => x.DestIp);
        Map(x => x.Protocol);
        Map(x => x.Scheme);
    }
}

public record Traffic(TrafficType Type, string Wan, string Lan, string Domain, string Org, IPAddress SrcIp, string SrcMac, IPAddress DestIp,
        string Protocol, string Scheme);
    
public enum TrafficType
{
    Type1,
    Type2
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多