这可能完全不可能,但我想知道是否有办法读取控制台已经打印的值。例如,如果控制台打印
您以10米/秒的速度向北行驶
作为Console.WriteLine("You are travelling north at a speed of 10m/s");
的结果,有没有办法读取这一行,然后,为了论证,将这个值放在一个字符串中?
基本上我需要的是读取已经输出到控制台的内容,而不是用户输入。有办法吗?
提前致谢。
答案 0 :(得分:7)
是。有一种方法。你可以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
。
答案 1 :(得分:3)
如果您仍希望输出到控制台,可以使用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<string>
的内部商店,如果您愿意的话。
背景:当我想让我的NHibernate查询输出到LINQPad的SQL Output选项卡中时,我在这些方面做了一些事情(虽然我没有保留输出的副本)。我在这里写了这篇文章(还有一个Github repo和NuGet包):https://tomssl.com/2015/06/30/see-your-sql-queries-when-using-nhibernate-with-linqpad/
答案 2 :(得分:0)
除非是用户输入,否则从控制台读取值通常是个坏主意。您应该将值放入变量中,或者如果您需要在以后读取它,请将其保存到文件中。
String a = "You are travelling north at a speed of 10m/s"
Console.WriteLine(a);
//Do anything you want with variable 'a'
答案 3 :(得分:0)
如果要将正在写入的内容保存到控制台,请先将其存储在String变量中,然后将此变量的内容打印到控制台,如下所示:
String consoleOutput = "You are travelling north at a speed of 10m/s"
Console.WriteLine(consoleOutput);
这样您就可以随时访问consoleOutput。