.NET 5/6如何适配Linux终端背景色?

How to adapt to Linux terminal back color in .NET 5/6?

我们有一个在 Windows/Linux/Mac 上运行的 .NET 5 控制台应用程序。

我们的控制台应用程序依赖于经典的前景颜色方案,在控制台中使用前景颜色 gray/yellow/red 突出显示 info/warning/error。但是,我们无法按照 Console.BackgroundColor documentation:

中的说明收集终端背景颜色

Unix systems don't provide any general mechanism to fetch the current console colors. Because of that, BackgroundColor returns (ConsoleColor)-1 until it is set in explicit way (using the setter).

现在我们强制控制台背景颜色为黑色,但是当终端背景颜色为白色时,这并不能很好地呈现:

如果我们能猜出终端背景颜色,我们就可以使前景色适应终端背景颜色(如终端背景颜色为白色时为黑色前景色,反之亦然)。但是从这个问题 How to determine a terminal's background color? 的答案来看,似乎没有标准的方法来获取适用于 Mac 和所有 Linux.

的背景颜色

解决这个问题的常用方法是什么?

好的,我们通过这种方式找到了解决方案:

  • 彩色消息在足够深的背景色上有白色前景色,因此无论用户背景色如何,彩色消息都会突出显示
  • 一旦我们修改了 Console.ForegroundColorConsole.BackgroundColor 以显示彩色消息,聪明的做法是调用 Console.ResetColor() 将前后颜色设置为默认值

无论终端的默认颜色如何,这都有效。

需要注意的一点是,您不应调用 Console.WriteLine(text) 这会在剩余的行字符上引起一些背景色问题。而是在 Console.ResetColor() 之前调用 Console.Write(text),然后通过调用 Console.WriteLine().

获得换行符
 System.Console.WriteLine("This is an info A");

 System.Console.ForegroundColor = ConsoleColor.White;
 System.Console.BackgroundColor = ConsoleColor.Red;
 System.Console.Write("This is an error");
 System.Console.ResetColor();
 System.Console.WriteLine();

 System.Console.WriteLine("This is an info B");

 System.Console.ForegroundColor = ConsoleColor.White;
 System.Console.BackgroundColor = ConsoleColor.DarkYellow;
 System.Console.Write("This is a warning");
 System.Console.ResetColor();
 System.Console.WriteLine();

 System.Console.WriteLine("This is an info C");

 System.Console.ForegroundColor = ConsoleColor.White;
 System.Console.BackgroundColor = ConsoleColor.Green;
 System.Console.Write("This is a success");
 System.Console.ResetColor();
 System.Console.WriteLine();

 System.Console.WriteLine("This is an info D");