gpt4 book ai didi

c# - 设置 Console.Error 写入的颜色

转载 作者:太空狗 更新时间:2023-10-30 01:24:01 24 4
gpt4 key购买 nike

我正在编写一个控制台应用程序,其中包含一个自定义记录器。记录器需要将发送到 Console.Error 的所有内容涂成红色。我现在有第三方引用,它们也写入 Console.Out 和 Console.Error,所以我必须以考虑到它们的方式执行此操作,因为我没有它们的源代码。我已经设置了我的记录器,以便任何写入控制台的代码都将通过调用 Console.SetOut 和 Console.SetError 方法使用我的记录器的 TextWriter。它有点工作,但我猜有某种同步问题?在我的 ErrorWriter 类中,您可以看到我正在设置控制台的前景色,然后调用 base.Write() 但结果与预期不同。来自 Console.Out 的文本应该是灰色的,现在变成红色,在中途它突然变成灰色。它一直在同一字符位置将颜色从红色变回灰色,但我假设 base.Write() 实际上并没有立即吐到控制台;有某种滞后时间/缓冲区。我试过调用 base.Flush() 但这会使 Console.Out 中的所有文本都变成红色,这更糟。我该如何解决这个问题?

public class Logger
{
private static TextWriter _out;
private static ErrorWriter _error;

public Logger()
{
Initiliaze();
}

public static TextWriter Out
{
get
{
return _out;
}
}

public static TextWriter Error
{
get
{
return _error;
}
}

private static void Initiliaze()
{
if (_out == null)
_out = new StreamWriter(Console.OpenStandardOutput());
if (_error == null)
_error = new ErrorWriter(Console.OpenStandardError());

Console.SetOut(Out);
Console.SetOut(Error);
}
}

public class ErrorWriter : StreamWriter
{
// constructors omitted to save space

public override void Write(string value)
{
Console.ForegroundColor = ConsoleColor.Red;
base.Write(value);
//base.Flush();
Console.ResetColor();
}

public override Encoding Encoding
{
get { return Encoding.Default; }
}
}

最佳答案

你可以装饰这个方法来做到这一点:

public class ConsoleErrorWriterDecorator : TextWriter
{
private TextWriter m_OriginalConsoleStream;

public ConsoleErrorWriterDecorator(TextWriter consoleTextWriter)
{
m_OriginalConsoleStream = consoleTextWriter;
}

public override void WriteLine(string value)
{
ConsoleColor originalColor = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Red;

m_OriginalConsoleStream.WriteLine(value);

Console.ForegroundColor = originalColor;
}

public override Encoding Encoding
{
get { return Encoding.Default; }
}

public static void SetToConsole()
{
Console.SetError(new ConsoleErrorWriterDecorator(Console.Error));
}
}

不要忘记运行“ConsoleErrorWriterDecorator.SetToConsole();”在开始写入控制台之前

关于c# - 设置 Console.Error 写入的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10532796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com