问题
Well, let me make it clear again. I have a console application with many classes, in each class there is at least one Console.WriteLine("text") line. I defined some arguments that when running the application, it output exactly what I wrote in classes. There, I want to define an argument that when I run the app with this argument, there will be no output on the console screen but the console window still appears. The argument maybe something like "-s". So is there any way I can do this without using the "if" condition in each class and passing an parameter through classes? Many thanks.
P/S: I've searched thru the internet and found out some articles related to this, but most of the answers were to hide the console window. I think this question should be what the others meant.
回答1:
Use Console.SetOut (http://msdn.microsoft.com/en-us/library/system.console.setout.aspx) and pass in a "null" text writer. The idea on -s perform a Console.SetOut(new StreamWriter()).
The example for the Console.SetOut method will help you get started.
In addition, you can easily add logging using this method.
回答2:
Use these methods to redirect output (programmatically):
Console.SetIn(...);
Console.SetOut(...);
Console.SetError(...);
回答3:
The Console.SetOut method throws a ArgumentNullException if you pass null directly; same for StreamWriter (if you pass a stream or if you pass a string.
What I use is passing the special Stream.Null field to a StreamWriter:
System.Console.SetOut(new System.IO.StreamWriter(System.IO.Stream.Null);
This redirect the stream to what is essentially the null device (/dev/null on *NIX machines).
回答4:
app.exe > nul
redirects output to nowhere. FYI: Using command redirection operators
回答5:
Have you come across Console.Clear(), you could call this in a way that makes it appear no text at all was output.
As for avoiding having to separately define this in each class you should look at inheritance. This allows you to define the functionality in one place and each 'sub' class will inherit this.
回答6:
You could use log4net to define the items you want to log. It allows you to log regarding log level, regarding which class you want to log and so on.
回答7:
This worked pretty well for me!:
Console.SetOut(StreamWriter.Null);
Console.SetError(StreamWriter.Null);
This doesn't work:
Console.SetOut(null);
Console.SetError(null);
It results in an ArgumentNullException.
This doesn't work:
Console.SetOut(new StreamWriter(null));
Console.SetError(new StreamWriter(null));
Because it is ambiguous between new StreamWriter(string path) and new StreamWriter(Stream stream).
And finally, neither of these work:
Console.SetOut(new StreamWriter(default(string)));
Console.SetError(new StreamWriter(default(Stream)));
Because they also result in an ArgumentNullException.
来源:https://stackoverflow.com/questions/7412701/how-to-hide-output-not-the-window-in-a-console-application