不支持 C# 记录类型?
C# record type not supported?
使用 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);
我收到以下消息的异常:
An unexpected error occurred.
IWriter state:
Row: 1 Index: 0
HeaderRecord:
1
如果我将记录对象的集合转换为 class 对象的集合,那么它会成功。 (试图将 record
实例传递给 class
构造函数没有用。我不得不创建一个 class
构造函数,它从 record
实例作为显式参数)
这是一个使用 CsvHelper 27.2.1 的 .NET Core 5.0 项目。
我得出的 C# record
类型不受 CsvHelper 支持的结论是否正确?
谢谢。
问题不在于 record
。问题是 IPAddress
的 AutoMap
。如果您创建具有 IPAddress
属性的 class,您将得到相同的错误。我不确定为什么 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
}
使用 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);
我收到以下消息的异常:
An unexpected error occurred. IWriter state: Row: 1 Index: 0
HeaderRecord: 1
如果我将记录对象的集合转换为 class 对象的集合,那么它会成功。 (试图将 record
实例传递给 class
构造函数没有用。我不得不创建一个 class
构造函数,它从 record
实例作为显式参数)
这是一个使用 CsvHelper 27.2.1 的 .NET Core 5.0 项目。
我得出的 C# record
类型不受 CsvHelper 支持的结论是否正确?
谢谢。
问题不在于 record
。问题是 IPAddress
的 AutoMap
。如果您创建具有 IPAddress
属性的 class,您将得到相同的错误。我不确定为什么 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
}