我正在尝试使用CsvHelper来改进从对象到csv记录/行的手动转换过程。我创建了一个复杂的ClassMap,我想用它来将对象列表写到文件中。如何将ClassMap添加到CsvHelper实例的Configuration中进行编写?
我现在收到以下异常和消息:
public class SpecimenMap : ClassMap<Specimen>
{
public SpecimenMap()
{
Map(s =>
DataFunctions.GetSiteByName(s.SiteName).RecordNo.ToString() + "-" +
s.SpecimenNumber.ToString()).
Index(0).Name("recordNumber");
Map(s =>
s.RecordNo.ToString()).
Index(1).Name("specimenNumber");
/ *还有更多,但是我在第一个“ Map”上设置了一个断点,并引发了异常。我还尝试注释掉第一个“ Map”并运行第二个“ Map”(因为第一个包含对外部函数的调用),因此结果相同。 * / ....
using (var writer = new StreamWriter(localFileLocation))
using (var csv = new CsvWriter(writer))
{
csv.Configuration.RegisterClassMap<SpecimenMap>(); // this line throws exception
csv.WriteRecords(specimen);
}
引发的异常: System.InvalidOperationException:在表达式'{expression}'中找不到成员。
在我的研究中,我找到了这段代码,但是我不知道如何解释该异常。在执行某种反射后有关堆栈大小的内容(第34行)。 https://github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper/Configuration/ClassMap%601.cs
答案 0 :(得分:1)
您得到的错误是告诉您Map()
函数期望仅从其表达式中获取类成员。 Map(s => s.SiteName)
。如果要进一步处理输出,可以使用ConvertUsing()
。
public static void Main(string[] args)
{
using (var csv = new CsvWriter(Console.Out))
{
var specimen = new List<Specimen> { new Specimen { SiteName = "DeepThought", SpecimenNumber = 1 } };
csv.Configuration.RegisterClassMap<SpecimenMap>();
csv.WriteRecords(specimen);
Console.ReadKey();
}
}
public class SpecimenMap : ClassMap<Specimen>
{
public SpecimenMap()
{
Map(s => s.SiteName).Index(0).Name("recordNumber").ConvertUsing(s => GetSiteByName(s.SiteName) + "-" + s.SpecimenNumber);
Map(s => s.SpecimenNumber).Index(1).Name("specimenNumber");
}
}
public class Specimen
{
public string SiteName { get; set; }
public int SpecimenNumber { get; set; }
}
public static int GetSiteByName(string siteName)
{
if (siteName == "DeepThought")
{
return 42;
}
return 1;
}