Не удается создать абстрактный класс при попытке создать список <T>из CSV с помощью csv.GetRecords () - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь создать универсальный метод, позволяющий мне анализировать документ CSV в объект по моему выбору.

Кажется, все работает нормально, но результаты после выполнения метода csv.GetRecords () пусты, и внутреннее исключение ответа: «Экземпляры абстрактных классов не могут быть созданы».

Я также пытался использовать csv.EnumerateRecords (запись); и получить тот же результат.

    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 Ответ

1 голос
/ 01 мая 2019

Я думаю, что добавление 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;
            }
        }
    }
...