我正在尝试创建一种通用方法,以使我能够将CSV文档解析为所选对象。
一切似乎都正常,但是执行csv.GetRecords()方法后的结果为空,并且响应的内部异常是“无法创建抽象类的实例。”
我也尝试过使用csv.EnumerateRecords(record);并获得相同的结果。
public class ImportManager
{
[Ignore]
public string FileSeperator { get; set; }
[Ignore]
public string Filename { get; set; }
public IEnumerable<T> ParseFile<T>() where T : class
{
using (var reader = new StreamReader(this.Filename))
using (var csv = new CsvReader(reader))
{
csv.Configuration.Delimiter = this.FileSeperator;
csv.Configuration.HasHeaderRecord = true;
var results = csv.GetRecords<T>();
return results;
}
}
}
public class MyObject : ImportManager
{
public string Field1 { get; set; }
public DateTime Field2 { get; set; }
public int Field3 { get; set; }
public List<MyObject> LoadFile()
{
var response = ParseFile<MyObject>();
return response.ToList<MyObject>();
}
}
MyObject moObjList= new MyObject() { Filename = "MyFileName.txt", FileSeperator = "|" };
var results = moObjList.LoadFile();
帮助!
答案 0 :(得分:1)
我相信将ToList()
添加到csv.GetRecords<T>()
可能会解决您的问题。 GetRecords<T>()
延迟加载。直到您调用return response.ToList<MyObject>();
时StreamReader
已经被处置,它才会尝试枚举记录。
public class ImportManager
{
[Ignore]
public string FileSeperator { get; set; }
[Ignore]
public string Filename { get; set; }
public IEnumerable<T> ParseFile<T>() where T : class
{
using (var reader = new StreamReader(this.Filename))
using (var csv = new CsvReader(reader))
{
csv.Configuration.Delimiter = this.FileSeperator;
csv.Configuration.HasHeaderRecord = true;
var results = csv.GetRecords<T>().ToList();
return results;
}
}
}