我可以使用ClassMap进行CsvHelper编写吗?

时间:2019-04-21 21:19:09

标签: csvhelper

我正在尝试使用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

1 个答案:

答案 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;
}