读取已打印到控制台的值
这可能是完全不可能的,但我想知道是否有办法读取控制台已经打印的值。 例如,如果控制台打印
您以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。