CsvHelper:没有为成员映射成员

MY_*_*Y_G 6 c# csvhelper

我使用CsvHelper 4.0.3.

我有一个像这样定义的嵌套类:

private class CsvLine {
    public string Solution;
    public string Project;
    public string DependsOnProject;
    public string Weight;
    public string DependsOnPackage;
    public string PackageVersion;
}
Run Code Online (Sandbox Code Playgroud)

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

Solution,Project,DependsOnProject,Weight,DependsOnPackage,PackageVersion

这是我的代码:

TextReader readFile = new StreamReader(dependenciesCsvFilePath);
var csvReader = new CsvReader(readFile);
IEnumerable<CsvLine> records = csvReader.GetRecords<CsvLine>();
Run Code Online (Sandbox Code Playgroud)

根据这里的文档,上面的代码应该工作.

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

我改变的可访问性CsvLine,从privatepublic,但是这并没有区别.

我做错了什么?

编辑:我已经尝试取消嵌套CsvLine类并将其公开,但这也没有帮助.

编辑:我按照Nkosi的建议做了改变; 然而,现在它说这records是一个空集合:"枚举没有产生任何结果".我的.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,,
Run Code Online (Sandbox Code Playgroud)

编辑:解决了!NkosiPanagiotis的答案相互补充.

Nko*_*osi 11

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

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; }
}
Run Code Online (Sandbox Code Playgroud)

您还应该阅读将类映射到csv文件.

CsvHelper:类映射

  • 我有与@my_g 相同的症状,并通过将所有属性上的私有设置器更改为公共设置器来解决它。 (2认同)

Pan*_*vos 6

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

Enumeration yielded no results在过去的调试器中遇到过这条消息.该消息具有误导性.还有记录,即使调试器说,有没有.您使用foreach或调用.ToArray().ToList()在其上迭代IEnumerable 以加载所有记录,例如:

var records = csvReader.GetRecords<CsvLine>();
foreach(var record in records)
{
     ...
}
Run Code Online (Sandbox Code Playgroud)

要么

var records = csvReader.GetRecords<CsvLine>().ToArray();
Run Code Online (Sandbox Code Playgroud)

您可以通过添加results 格式说明符强制调试器在Watch,Quick Watch或Immediate窗口中显示IEnumerable中的所有项目,例如:

records,results
Run Code Online (Sandbox Code Playgroud)

要小心,因为这将执行IEnumerable并返回所有结果.

你可以在Visual Studio 2017中的7个隐藏宝石中找到这个和其他技巧


小智 5

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

using (var csv = new CsvWriter(writer))
{
    csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;
.....
}
Run Code Online (Sandbox Code Playgroud)