2009-07-22 9 views
0

私はSystem.IO.TextWriterのインスタンスを持っています。これはSystem.Consoleから渡されることがあります。それを見つけるための方法は例外なくコンソールです。私はこれを試してみましたが、コンパイルされていない:TextWriterインスタンスを見つける方法はコンソールですか?

if (_myWriter as System.Console != null) // error compiling 

私は私が代わりにボクシングの型チェックを使用する必要が推測しますか?あなたが行うことができ

+0

実際、System.Consoleはシステムの静的インスタンスです。 –

+0

@David Chu:そうではありません。 System.Consoleはクラスであり、Systemは名前空間です。あなたはJavaとSystem.console()を考えていますか? (これはConsoleのインスタンスです)。 –

答えて

2

あなたは下のIsConsoleOutような何かを試みることができる:誰かがConsole.OpenStandardOutputを使用してコンソール出力ストリーム((周りを直接自分のしたTextReaderを作成することができます残念ながら、これは、証拠を欺くされていない

static void Main(string[] args) 
{ 
    Console.WriteLine("Console.Out: {0}", IsConsoleOut(Console.Out)); 
    Console.WriteLine("Other: {0}", IsConsoleOut(new StreamWriter(Stream.Null))); 
    Console.ReadLine(); 
} 

private static bool IsConsoleOut(TextWriter textWriter) 
{ 
    return object.ReferenceEquals(textWriter, Console.Out); 
} 

))、そして上記の関数はそれを識別することに失敗しますが、TextWriterは常にConsole.Outから来ている必要があります - 私は思う!

+0

これはどうですか? static bool IsConsoleOutput(TextWriter writer、bool outOrError){ return(writer!= null)&&(object.ReferenceEquals(writer、 outOrError?Console.Out:Console .Error); } –

+0

私はむしろ単に "if(writer!= Console.Error)"を呼び出しコードで使用したいと思います。なぜ2つのパラメータを持つメソッドを使って比較するのは簡単でしょうか? –

+0

@Jon:別のメソッドではなくインライン展開についてのポイントですが、これは本当に何かではなく説明的なコードでの例にすぎないことを意味していましたが、TextWriterは同等の演算子をオーバーロードしないため、Object.ReferenceEqualsへの呼び出しが必要です。 Reference Equals対==については、唯一の真の理由前者を後者よりも使用することは、コードの意図を明確にすることの1つです - ReferenceEqualsとあいまいさはありません。私はそれをそのようにするためのあらゆる種類のペナルティを支払うとは思いませんか? –

0

if (_myWriter == Console.Out) 

が、それは保証ません - それは例えば、Console.Out周りのラッパーである可能性があります。

この場合、なぜ別の扱いをしたいのですか?特別なケースのコンソールライターであるIMOよりも、これを考慮して設計するほうがよかったでしょう。

0
if(_myWriter == System.Console.Out) 
0

あなたのユースケースについて再考することをお勧めします。 System.Console.Outは、たとえばファイルにリダイレクトできます。あなたのコードはまだそれをコンソールとして扱いたいでしょうか?

+0

はい。私はクラスからコンソール機能を取り除いたばかりです。したがって、TextWriterがコンソールであるかどうかを確認する必要はありません。 –

関連する問題