#c# #.net #.net-3.5 #console
#c# #.net #.net-3.5 #консоль
Вопрос:
Я вызываю метод, скажем, FizzBuzz()
, над которым у меня нет контроля. Этот метод выводит кучу данных на консоль с помощью Console.WriteLine
.
Возможно ли для меня перехватить вывод, генерируемый FizzBuzz
методом? Обратите внимание, что мое приложение само по себе является консольным приложением.
Ответ №1:
Да, очень возможно:
var consoleOut = new StringWriter();
Console.SetOut(consoleOut);
Console.WriteLine("This is intercepted."); // This is not written to console
File.WriteAllText("ConsoleOutput.txt", consoleOut.ToString());
Позже, если вы захотите прекратить перехватывать вывод консоли, используйте модификацию ниже:
var stdOut = Console.Out;
// Above interceptor code here..
Console.SetOut(stdOut); // Now all output start going back to console window
Или OpenStandardOutput делает то же самое без необходимости сначала сохранять стандартный поток:
// Above interceptor code here..
var standardOutput = new StreamWriter(Console.OpenStandardOutput());
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput); // Now all output starts flowing back to console
Комментарии:
1. Не забудьте сохранить
Console.Out
перед выполнением этого, чтобы вы могли восстановить его.2. @Rick: Если только кто-то уже не отключил его! 🙂
Console.OpenStandardOutput()
всегда выдаст вам реальный.3. @Porges: Если
FizzBuzz
придерживается той же точки зрения, нам не повезло 🙂4. @Teoman Soygul: стоит отметить, что это работает, только если FizzBuzz выполняется в том же домене приложения. Скорее всего, это не проблема для OP, просто отмечу, для полноты картины.
5. Как насчет перехвата цветного вывода: т.Е.:
var oldColor = Console.ForegroundColor; Console.ForegroundColor = color ?? oldColor; Console.Write(message); Console.ForegroundColor = oldColor;