读取已打印到控制台的值

这可能是完全不可能的,但我想知道是否有办法读取控制台已经打印的值。 例如,如果控制台打印

您以10米/秒的速度向北行驶

由于Console.WriteLine("You are travelling north at a speed of 10m/s"); ,有没有办法读取这一行,然后,为了论证,将这个值放在一个字符串?

基本上我需要的是读取已经输出到控制台的内容,而不是用户输入。 有办法吗?

提前致谢。

是。 有一种方法。 你可以使用Console.SetOut方法。

组织你的主要方法;

 static void Main() { using (StringWriter stringWriter = new StringWriter()) { Console.SetOut(stringWriter); //All console outputs goes here Console.WriteLine("You are travelling north at a speed of 10m/s"); string consoleOutput = stringWriter.ToString(); } } 

然后consoleOutput应该让You are travelling north at a speed of 10m/s

如果您仍希望输出到控制台,可以使用Console.SetOut并同时为其提供两个目标,一个是主控制台窗口,另一个是内部存储。

你可以编写一个这样的简单助手类:

 public class OutputCapture : TextWriter, IDisposable { private TextWriter stdOutWriter; public TextWriter Captured { get; private set; } public override Encoding Encoding { get { return Encoding.ASCII; } } public OutputCapture() { this.stdOutWriter = Console.Out; Console.SetOut(this); Captured = new StringWriter(); } override public void Write(string output) { // Capture the output and also send it to StdOut Captured.Write(output); stdOutWriter.Write(output); } override public void WriteLine(string output) { // Capture the output and also send it to StdOut Captured.WriteLine(output); stdOutWriter.WriteLine(output); } } 

然后在您的主代码中,您可以包装您的语句,如下所示:

 void Main() { // Wrap your code in this using statement... using (var outputCapture = new OutputCapture()) { Console.Write("test"); Console.Write("."); Console.WriteLine(".."); Console.Write("Second line"); // Now you can look in this exact copy of what you've been outputting. var stuff = outputCapture.Captured.ToString(); } } 

您可以将其更改为具有多个目标,因此您可以创建一个类似于List的内部存储,如果您愿意的话。

背景:当我想将NHibernate查询输出到LINQPad的SQL Output选项卡中时,我在这些方面做了一些事情(虽然我没有保留输出的副本)。 我在这里写了一篇文章(还有一个Github repo和NuGet包): https : //tomssl.com/2015/06/30/see-your-sql-queries-when-using-nhibernate-with-linqpad/

除非是用户输入,否则从控制台读取值通常是个坏主意。 您应该将值放入变量中,或者如果您需要在以后读取它,请将其保存到文件中。

 String a = "You are travelling north at a speed of 10m/s" Console.WriteLine(a); //Do anything you want with variable 'a' 

如果要将正在写入的内容保存到控制台,请先将其存储在String变量中,然后将此变量的内容打印到控制台,如下所示:

 String consoleOutput = "You are travelling north at a speed of 10m/s" Console.WriteLine(consoleOutput); 

这样您就可以随时访问consoleOutput。