我将一些读取代码的cv合并到一个单独的类中,我想要让它覆盖streamreader。但是,我想保留我添加的类私有值(分隔符,记录计数等),并能够关闭并重新打开该文件。
我需要能够快速传递以确定各种事物,例如分隔符,数据中是否存在嵌入的换行符,实际记录数,字段数等等。
显然我不能使用(streamreader sr = new streamreadder(filename)),因为这会破坏最后的对象,但是我可以关闭文件并重新打开它吗?我可以做cvsstreamclass sr = new cvsstreamclass(filename),然后是sr.close()和sr.open()吗?我知道streamreader seek有问题,所以我可能不应该只使用它。
或者我是否认为这一切都错了,我应该将streamreader对象传递给一个处理解析的类吗?
不过,我并没有考虑转换到开源cvs类或其他库。我已经编写了很多这样的代码,但它确实有效。无需暗示。答案 0 :(得分:1)
CSV解析器不是 StreamReader
。这两者没有关系,也不应该存在继承关系。
您的CsvReader
班级应该有StreamReader
个成员。您可以根据需要设置和操作该成员。例如,您可以随时关闭现有的阅读器并创建一个新阅读器。
答案 1 :(得分:1)
我建议您实际将StreamReader
存储在您的阅读器类中。除非您以StreamReader
的形式将其公开给其他代码,否则继承StreamReader
是没有意义的。我会做这样的事情:
public class CSVReader
{
private StreamReader reader;
private string fileName;
//Your other properties and fields here
public CSVSReader(string filename)
{
this.fileName = fileName;
InitReader();
}
public void CloseFile()
{
if (reader != null)
{
reader.Close();
reader = null;
}
}
public void OpenFile()
{
CloseFile();
reader = new StreamReader(File.OpenRead(fileName));
}
//Your other methods here
}
显然,我没有使用任何try-catch块来打开文件,但这只是为了便于阅读。
您也可以从IDisposable
继承,让您的课程在using ()
区域内使用。