Временно измените значение (цвет текста) и восстановите его после некоторой операции (печать текста)

2

Прежде всего, я очень сожалею об этом названии, просто невозможно суммировать это в 150 букв.

Допустим, я хочу сделать varable, который меняет цвет текста на зеленый для всего, что вы печатаете в его фигурных скобках, однако, когда фигурные скобки закрыты, он меняет цвет текста консоли обратно на серый для следующих вещей, которые я печатаю.

Короче говоря, я хотел сделать следующее:

Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("test");
Console.ForegroundColor = ConsoleColor.gray;

но так как у меня есть много в моем коде, я хочу сократить это так:

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

Возможно ли что-то подобное?

  • 1
    Да. Это то, что методы для.
  • 0
    То, что вы ищете, называется transclusion, и я не знаю, есть ли у C # такая возможность.
Показать ещё 3 комментария
Теги:
curly-braces

2 ответа

2
Лучший ответ

Вы могли бы сделать что-то вроде этого

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");

или использовать Action

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

использование

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

// or

ColorFancy(ConsoleColor.Black, ConsoleColor.Blue, () =>
      {
         // lots of things here
         Console.WriteLine("dfgdfgdfgdfg");
      });
  • 0
    @aGoodFellow все хорошо, это было то, о чем был второй пример, лично я бы не стал злоупотреблять такой схемой распоряжения, как бы она ни была распространена и законна. удачи
  • 0
    Прежде всего, спасибо, потому что первый был предопределенным кодом, он не может быть полезен для каждой ситуации, поэтому я предпочел вторую, но у меня есть серьезные проблемы, когда речь идет об использовании внутри него переменных, которые соединяются с программным кодом.
Показать ещё 2 комментария
1

Вы можете создать IDisposable реализацию и злоупотребление, using для этого

public class ConsoleColorBlock : IDisposable
{
    public ConsoleColorBlock(ConsoleColor c1, ConsoleColor c2)
    {
    // Set color to c1
    }

    public void Dispose()
    {
    // Set color to c2
    }
}

А потом в вашем коде

using(new ConsoleColorBlock(...))
{
// Whatever code you want
}

Обратите внимание, что код в методе Dispose будет выполнен, даже если код внутри using выдает исключение.

  • 0
    Мне нравится этот шаблон (даже если половина людей считает его чистым злом) ... Обратите внимание, что обычно вы передаете только одно «новое» значение, а код в конструкторе захватывает «текущее» значение, чтобы восстановить его позже (возможно, со статическим помощники для известных ценностей). как using(ConsoleColorBlock.Red()) { Console.WriteLine("Alarm!!!"); }
  • 0
    @AlexeiLevenkov Отличный момент, я добавил пример для этого.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню