【问题标题】:Can I use a ClassMap for writing with CsvHelper?我可以使用 ClassMap 来编写 CsvHelper 吗?
【发布时间】:2019-04-21 21:19:09
【问题描述】:

我正在尝试使用 CsvHelper 改进从对象到 csv 记录/行的手动转换过程。我创建了一个复杂的ClassMap,我想用它来将对象列表写入文件。如何将ClassMap 添加到 CsvHelper 实例的配置中进行写入?

我现在收到以下异常和消息:

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"); 

/* 更多,但我在第一个“地图”上设置了一个断点,它会引发异常。我还尝试注释掉第一个“地图”并运行第二个(因为第一个包括对外部函数的调用),它具有相同的结果。 */ ....

        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:在表达式中找不到成员 '{表达式}'。

在我的研究中,我发现了这段代码,但我不知道如何解释异常。进行某种反射后的堆栈大小(第 34 行)。 https://github.com/JoshClose/CsvHelper/blob/master/src/CsvHelper/Configuration/ClassMap%601.cs

【问题讨论】:

    标签: csvhelper


    【解决方案1】:

    您得到的错误是告诉您Map() 函数只希望从它的表达式中获取一个类成员。 Map(s =&gt; s.SiteName)。如果想进一步操作输出,可以使用ConvertUsing()

    更新版本 27.2.1。 ClassMapContext 上注册,ConvertUsing() 已更改为Convert()

    public static void Main(string[] args)
    {    
        using (var csv = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
        {
            var specimen = new List<Specimen> { new Specimen { SiteName = "DeepThought", SpecimenNumber = 1 } };
    
            csv.Context.RegisterClassMap<SpecimenMap>();
    
            csv.WriteRecords(specimen);
    
            Console.Read();
        }            
    }
    
    public class SpecimenMap : ClassMap<Specimen>
    {
        public SpecimenMap()
        {
            Map(s => s.SiteName).Index(0).Name("recordNumber").Convert(s => GetSiteByName(s.Value.SiteName) + "-" + s.Value.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;
    }
    

    原创

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

    【讨论】:

    • 感谢您的提示!
    • 对于任何发现这个的人来说仅供参考,我必须使用objCsvWriter.Context.RegisterClassMap&lt;EmailRecordMap&gt;();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    相关资源
    最近更新 更多