Я хотел сделать мою жизнь немного проще, инкапсулируя итерации строк, используя CsvHelper
, например:
public IEnumerable<IReaderRow> ReadRows(string filename, Encoding encoding, bool hasHeaders)
{
using (StreamReader sr = new StreamReader(filename, encoding, false, 65536))
{
CsvHelper.Configuration.Configuration konfig =
new CsvHelper.Configuration.Configuration() {/*My settings*/};
using (CsvReader csv = new CsvReader(sr, konfig))
{
if (hasHeaders)
{
csv.Read();
csv.ReadHeader();
}
while (csv.Read())
yield return csv;
}
}
}
Попытка использовать это в модульном тесте следующим образом:
IReaderRow testRow = encapsulatedReader.ReadRows(/*...*/).First();
После этой строки я не могу использовать testRow
, потому что это просто ссылка на объект CsvReader
из итератора, и этот объект был удален в конце итерации из-за using
. Помимо прочего, контекст и конфигурация теряются.
Я понимаю, что это в основном установка, которая упрощается инкапсуляцией, но если я делаю , хочу использовать свой собственный итератор для чтения строк и все еще использовать возможности интерфейса IReaderRow
для каждая строка (т.е. возвращать этот интерфейс для каждой строки), как мне это реализовать?