我有一个应用程序可以将各种状态更新和时间写入控制台。我还有一个电子邮件功能,通过电子邮件发送给客户。我希望在应用程序结束时发送一封电子邮件,其中包含来自控制台(同一应用程序)的所有行。
似乎没有Console.ReadAllLines功能。
我在GetStdHandle中看到了一些想法,但可以让它发挥作用。
我在c#pls中如何做到这一点?
答案 0 :(得分:4)
您可以通过实施自己的TextWriter
和Console.SetOut
public class MyWriter : TextWriter
{
private List<string> lines = new List<string>();
private TextWriter original;
public MyWriter(TextWriter original)
{
this.original = original;
}
public override Encoding Encoding
{
get { return Encoding.Default; }
}
public override void WriteLine(string value)
{
lines.Add(value);
original.WriteLine(value);
}
//You need to override other methods also
public string[] GetLines()
{
return lines.ToArray();
}
}
并像这样使用
var writer = new MyWriter(Console.Out);
Console.SetOut(writer);
Console.WriteLine("Hello world");
Console.WriteLine("Bye!");
var lines = writer.GetLines();
答案 1 :(得分:2)
读取已经输出到控制台的信息是一种向后设计。而是将信息存储在DB /文件/内存中,以便可以重复使用。继续像你一样显示输出。但是,当您需要发送电子邮件时,请从DB /文件/内存中挖掘信息。
可以这样做:
List<string> outputList = new List<string>();
string output = GetOutput();//Run continuously...perhaps in a loop or event trigger..whatever applies
outputList.Add(output);
Console.Writeline(output);
//when ready
SendEmail(outputList);
答案 2 :(得分:1)
你可以编写一个包装类来轻松处理它。
public class ConsoleWriter()
{
public static List<string> AllLines = new List<string>();
public static WriteConsole(string text)
{
AllLines.Add(text);
Console.Write(text);
}
}
如果要发送邮件,请阅读AllLines。