尝试使用csv.GetRecords()

时间:2019-05-01 12:15:30

标签: c# asp.net-mvc-4 csvhelper

我正在尝试创建一种通用方法,以使我能够将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();

帮助!

1 个答案:

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