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

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

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

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

リダイレクトした標準出力の出力先を元に戻す
using System;
using System.IO;

class Sample {
  static void Main()
  {
    // 初期状態での標準出力の出力先を退避しておく
    var stdout = Console.Out;

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

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

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

    // この内容はファイルstdout.txtに書き込まれる
    Console.WriteLine("Hello, world!");

    // 標準出力の出力先を元に戻す
    Console.SetOut(stdout);

    // この内容は(初期状態での)標準出力に書き込まれる
    Console.WriteLine("こんにちは、世界!");
  }
}
実行結果
>sample.exe
こんにちは、世界!

>type stdout.txt
Hello, world!

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

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