CsvHelper:没有为类型映射成员

CsvHelper: No members are mapped for type

我用CsvHelper 4.0.3.

我有一个 嵌套 class 定义如下:

private class CsvLine {
    public string Solution;
    public string Project;
    public string DependsOnProject;
    public string Weight;
    public string DependsOnPackage;
    public string PackageVersion;
}

我想使用 CsvHelper 解析的 .csv 文件具有以下字段名称:

Solution,Project,DependsOnProject,Weight,DependsOnPackage,PackageVersion

这是我的代码:

TextReader readFile = new StreamReader(dependenciesCsvFilePath);
var csvReader = new CsvReader(readFile);
IEnumerable<CsvLine> records = csvReader.GetRecords<CsvLine>();

根据文档 here,上面的代码应该可以工作。

但是,当我检查 records 时,我看到消息 No members are mapped for type 'ParentClass+CsvLine'

我将 CsvLine 的可访问性从 private 更改为 public,但这没有任何区别。

我做错了什么?

编辑: 我尝试取消嵌套 CsvLine class 并将其设为 public,但这也无济于事。

编辑: 我做了 的更改;然而,现在它说 records 是一个空集合:"Enumeration yielded no results"。我的 .csv 文件中肯定存在数据,因此该集合不应为空。

以下是一些示例数据:

Solution,Project,DependsOnProject,Weight,DependsOnPackage,PackageVersion
FOD.sln,ABC.DEF,IMS.ABC,1,,
FOD.sln,ABC.DEF,IMS.DEF,1,,
FOD.sln,ABC.DEF,IMS.GHI,1,,
FOD.sln,ABC.DEF,IMS.JKL,1,,

编辑: 已解决! and 答案相辅相成。

默认情况下,您需要使用属性而不是对象模型中的字段,它将映射匹配的 public 成员

public class CsvLine {
    public string Solution { get; set; }
    public string Project { get; set; }
    public string DependsOnProject { get; set; }
    public string Weight { get; set; }
    public string DependsOnPackage { get; set; }
    public string PackageVersion { get; set; }
}

您还应该阅读有关将 类 映射到 csv 文件的内容。

CsvHelper: Class Mapping

Nkosi 解释说 CsvHelper 默认映射到属性。

我以前在调试器中遇到过 Enumeration yielded no results 消息。该消息具有误导性。有 记录,即使调试器说没有。您使用 foreach 遍历 IEnumerable 或对其调用 .ToArray().ToList() 以加载所有记录,例如:

var records = csvReader.GetRecords<CsvLine>();
foreach(var record in records)
{
     ...
}

var records = csvReader.GetRecords<CsvLine>().ToArray();

您可以强制调试器在 Watch、Quick Watch 或 Immediate window 中显示 IEnumerable 中的所有项目,方法是添加 results format specifier,例如:

records,results

小心,因为这将执行 IEnumerable 和 return 所有结果。

您可以在 7 Hidden Gems in Visual Studio 2017

中找到这个和其他技巧

其他可能的原因:

  • Header 字符串引用字符。
  • 分隔符字符。

配置它们的示例代码:

var conf = new CsvHelper.Configuration.Configuration();
conf.Delimiter = ",";
conf.Quote = '\'';
var csv = new CsvHelper.CsvReader(reader, conf);
var rows = csv.GetReads<MyClass>();

这个问题有更简单的解决方法,只需要一行代码。您必须告诉 csvhelper 查看您的字段。

using (var csv = new CsvWriter(writer))
{
    csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;
.....
}

从 CsvHelper 12.2.2 开始,这是我必须做的才能让它工作

csv.Read() 
csv.ReadHeader()
csv.GetRecords<T>().ToList();

出于某种原因,尽管有 CsvReader 的文档,但添加 Read() 和 ReadHeader() 方法将使其真正从 csv 文件中提取数据。