2010-11-14 68 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有效。

相關問題