Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 临时更改值(文本颜色)并在某些操作(打印文本)后恢复_C# - Fatal编程技术网

C# 临时更改值(文本颜色)并在某些操作(打印文本)后恢复

C# 临时更改值(文本颜色)并在某些操作(打印文本)后恢复,c#,C#,我想创建一个“变量”,它可以将文本颜色更改为绿色,无论您在它的大括号中打印什么,但是当大括号关闭时,它会将控制台文本颜色更改为灰色,以便我接下来打印的内容 简而言之,我想做的是: Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("test"); Console.ForegroundColor = ConsoleColor.gray; 但由于我的代码中有很多这样的内容,我想将其缩短如下: mycmd(green, g

我想创建一个“变量”,它可以将文本颜色更改为绿色,无论您在它的大括号中打印什么,但是当大括号关闭时,它会将控制台文本颜色更改为灰色,以便我接下来打印的内容

简而言之,我想做的是:

Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("test");
Console.ForegroundColor = ConsoleColor.gray;
但由于我的代码中有很多这样的内容,我想将其缩短如下:

mycmd(green, gray)
{
    Console.WriteLine("test");
}

你可以这样做

public static void ColorAndWrite(ConsoleColor c1, ConsoleColor c2, string text)
{
   Console.ForegroundColor = c1;
   Console.WriteLine(text);
   Console.ForegroundColor = c2;
}
用法

ColorAndWrite(ConsoleColor.Black,ConsoleColor.Blue, "asdads");
ColorFancy(ConsoleColor.Black, ConsoleColor.Blue, () =>  Console.WriteLine("dfgdfgdfgdfg"));

// or

ColorFancy(ConsoleColor.Black, ConsoleColor.Blue, () =>
      {
         // lots of things here
         Console.WriteLine("dfgdfgdfgdfg");
      });
或者使用
操作

public static void ColorFancy(ConsoleColor c1, ConsoleColor c2, Action action)
{
   Console.ForegroundColor = c1;
   action.Invoke();
   Console.ForegroundColor = c2;
}
用法

ColorAndWrite(ConsoleColor.Black,ConsoleColor.Blue, "asdads");
ColorFancy(ConsoleColor.Black, ConsoleColor.Blue, () =>  Console.WriteLine("dfgdfgdfgdfg"));

// or

ColorFancy(ConsoleColor.Black, ConsoleColor.Blue, () =>
      {
         // lots of things here
         Console.WriteLine("dfgdfgdfgdfg");
      });

您可以创建一个
IDisposable
实现,并为此使用
s来滥用

public class ConsoleColorBlock : IDisposable
{
    private readonly ConsoleColor _c2;

    public ConsoleColorBlock(ConsoleColor c1, ConsoleColor c2)
    {
        Console.ForegroundColor = c1;
        _c2 = c2;
    }

    public void Dispose()
    {
        Console.ForegroundColor = _c2;
    }
}
然后在你的代码里

using(new ConsoleColorBlock(ConsoleColor.Green, ConsoleColor.Gray))
{
    // Whatever code you want
}
请注意,
Dispose
方法中的代码将被执行,即使
using
中的代码抛出异常

正如@AlexeiLevenkov在评论中所建议的,您可以使用此模式捕获当前控制台颜色并还原它,而无需将其明确地传递给构造函数

public class ConsoleColorBlock : IDisposable
{
    private readonly ConsoleColor _originalColor;

    public ConsoleColorBlock(ConsoleColor color)
    {
        _originalColor = Console.ForegroundColor;
        Console.ForegroundColor = color;
    }

    public void Dispose()
    {
        Console.ForegroundColor = _originalColor;
    }
}

对这就是你要找的。你要找的叫做转换,我不知道C#有这种能力。@Scottie-转换对我来说是个新名词,所以我查了一下。不过,我并没有看到这个问题和转述之间的联系。开放的说服…也许维基百科错了。不知道这个链接是否对你有任何价值,但你可能想看看@NocTrS2我不认为问题是关于如何做到这一点,而是如何编写代码恢复颜色以某种自动的方式(或甚至更广泛-任何价值,改变和需要恢复后,一些代码块完成),我喜欢这种模式(即使有一半的人认为它是纯粹的邪恶)…请注意,通常只传递一个“新”值,构造函数中的代码将捕获“当前”值,以便稍后恢复它(可能使用已知值的静态帮助程序)。像
使用(consoleColorbock.Red()){Console.WriteLine(“Alarm!!!”);}
@AlexeiLevenkov极好的观点,我添加了一个例子。嗯,当我添加
ConsoleKeyInfo remSelection=Console.ReadKey()时,我遇到了一个问题行,因为“remSelection”与代码的其余部分不连接。但不管怎样,谢谢你们两位的帮助。@agoodfelle都很好,这就是第二个示例的内容,我个人不会滥用这样的dispose模式,尽管它非常常见和合法。好运气首先谢谢你,因为第一个是预先确定的代码,它不可能对所有情况都有用,所以我更喜欢第二个,但是当涉及到使用其中的变量连接到程序代码时,我遇到了严重的问题。@agoodfelle最好问另一个问题,并准确地说明你的行动方法有什么问题。你的问题又会是新的,会带来更多的观点和意见,明白了,我为我造成的混乱感到抱歉。