CsvHelper:没有为类型映射成员
CsvHelper: No members are mapped for type
我有一个 嵌套 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 文件的内容。
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 所有结果。
中找到这个和其他技巧
其他可能的原因:
- 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 文件中提取数据。
我有一个 嵌套 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,,
编辑: 已解决!
默认情况下,您需要使用属性而不是对象模型中的字段,它将映射匹配的 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 文件的内容。
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 所有结果。
中找到这个和其他技巧其他可能的原因:
- 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 文件中提取数据。