2010-11-14 66 views

回答

3

在.NET Framework中没有直接的等价物。

如果你创建一个自定义类,我建议你创建扩展TextReader并包装TextReader实例类,所以它可以与任何TextReader子类(StreamReaderStringReader)一起使用。

至少,您需要覆盖TextReader.ReadTextReader.Peek方法。为了提高效率,您还应该覆盖TextReader类的所有其他虚拟方法。

class LineNumberTextReader : TextReader 
{ 
    private readonly TextReader reader; 
    private int b; 
    private int line; 

    public LineNumberTextReader(TextReader reader) 
    { 
     if (reader == null) throw new ArgumentNullException("reader"); 
     this.reader = reader; 
    } 

    public int Line 
    { 
     get { return this.line; } 
    } 

    public override int Peek() 
    { 
     return this.reader.Peek(); 
    } 

    public override int Read() 
    { 
     int b = this.reader.Read(); 
     if ((this.b == '\n') || (this.b == '\r' && b != '\n')) this.line++; 
     return this.b = b; 
    } 

    protected override void Dispose(bool disposing) 
    { 
     if (disposing) this.reader.Dispose(); 
    } 
} 
1

没有这样的功能。你必须保持一个局部变量,并增加或实现一个简单的StreamReader:

public class CustomStreamReader : StreamReader 
{ 
    private int _lineNumber = 0; 

    public CustomStreamReader(Stream stream) 
     : base(stream) 
    { 
    } 

    public int LineNumber 
    { 
     get 
     { 
      return _lineNumber; 
     } 
    } 

    public override string ReadLine() 
    { 
     _lineNumber++; 
     return base.ReadLine(); 
    } 
} 

请记住,这类假设你只有一个Stream初始化它,你只会调用ReadLine()。否则,您必须完全覆盖以确保LineNumber有效。

相关问题