SetIn/SetOut/SetErrorの各メソッドを使うと、実行時に標準ストリームを任意のTextReader/Writerへとリダイレクトすることができます。

標準ストリームのリダイレクトを行うと、Console.WriteLineやReadLineなどのメソッドの入出力先は、リダイレクト先として指定されたTextReader/Writerへと変更されます。

次の例ではSetOutメソッドを使って標準出力の出力先を実行時に開いたファイルに変更しています。

標準出力をStreamWriterにリダイレクトする
using System;
using System.IO;

class Sample {
  static void Main()
  {
    // この内容はデフォルトの標準出力に書き込まれる
    Console.WriteLine("Hello, world!");

    // ファイルstdout.txtへ書き込むStreamWriterを作成する
    var writer = new StreamWriter("stdout.txt");

    // 書き込みの度にバッファをフラッシュさせるためにAutoFlushをtrueにする
    writer.AutoFlush = true;

    // 作成したStreamWriterを標準出力の出力先にする
    Console.SetOut(writer);

    // この内容はファイルstdout.txtに書き込まれる
    Console.WriteLine("こんにちは、世界!");
  }
}
実行結果
>sample.exe
Hello, world!

>type stdout.txt
こんにちは、世界!

Console.In/Out/Errorプロパティから取得できるTextReader/Writerをリダイレクトする前に退避しておき、あとで再度リダイレクト先として設定することにより、一度リダイレクトした標準ストリームの入出力先を元の状態に戻すことができます。

TextReader/Writerクラスは抽象クラスであるため、たいていの場合リダイレクト先の設定には派生クラスであるStreamReader/Writerを使うことになります。 TextReader/WriterおよびStreamReader/Writerの作成や扱い方についてはStreamReaderクラス・StreamWriterクラスを参照してください。

SetIn/SetOut/SetErrorメソッドではStreamをリダイレクト先として直接設定することはできません。 Streamをリダイレクト先として設定したい場合は、そのStreamをベースにしてStreamReader/Writerを作成する必要があります。 具体的な方法についてはStreamReaderクラス・StreamWriterクラス §.任意のStreamからの読み込み・書き込みを参照してください。