C #: ссылка на классы по переменной - PullRequest
3 голосов
/ 22 марта 2012

Я пытаюсь освоить использование переменных в C #, но наткнулся на контрольно-пропускной пункт. Следующее не работает.

public static void SetBG(string s)
{
    Console.BackgroundColor = ConsoleColor.s;
}

Очень простой метод, который должен устанавливать цвет фона консоли в соответствии с тем, что программист отправил через переменную s. Если бы я использовал SetBG("Red");, он должен пройти, но это не так. Это потому что System.ConsoleColor' does not contain a definition for 's'.

Как я могу сделать это в C #?

Ответы [ 6 ]

3 голосов
/ 22 марта 2012

Это неправильный способ сделать это, и похоже, что есть две основные концепции, с которыми у вас возникают проблемы, и понимание их поможет вам сделать это правильно.

Во-первых, sпеременная в вашем текущем классеConsoleColor.s будет ссылаться на переменную s в классе ConsoleColor (он не имеет ее, следовательно, ваша ошибка).Это называется scope или encapsulation и позволяет нам повторно использовать общие слова / имена без конфликта.

Во-вторых, ваш код будет скомпилирован до его запуска,и ConsoleColor.s (при условии, что такое было) больше не будет говорить ConsoleColor.s.Вместо этого он будет указывать на место в памяти, где хранится значение, представляющее «s».s, передаваемый вашему методу, будет строкой, такой как «Red» или «Blue».Нет связи между такой строкой и слотом в памяти для другого объекта для хранения его значений.

Чтобы сделать то, что вы пытаетесь сделать, вам нужно взять имя цвета и перевести его вцвет.Один из способов сделать это - выполнить серию операторов if / else, проверяющих содержимое строки и назначающих соответствующий цвет, если он соответствует имени цвета.
К счастью, существует более простой способ.Вы можете просто разобрать строку в ConsoleColor!

. Следуя примеру MSDN , вы можете сделать это:

Console.BackgroundColor = (ConsoleColor) Enum.Parse(typeof(ConsoleColor), s);
2 голосов
/ 22 марта 2012
ConsoleColor colour;
if (ConsoleColor.TryParse(s, out colour))
{
   Console.BackgroundColor = colour;
}
2 голосов
/ 22 марта 2012

Это потому, что ConsoleColor является перечислением, попробуйте

 Console.BackgroundColor = (ConsoleColor) Enum.Parse(typeof(ConsoleColor), s);

Вам следует рассмотреть обработку, если строка недопустима (например, s = "Ship") с чем-то вроде этого

 ConsoleColor colorValue;
 if (Enum.TryParse(s, out colorValue))
 {        
     Console.BackgroundColor = colorValue;
 }
2 голосов
/ 22 марта 2012

ConsoleColor - это перечисление. Вам придется разыграть s.

public static void SetBG(string s){
   Console.BackgroundColor = (ConsoleColor) Enum.Parse(typeof(ConsoleColor), s);
}
2 голосов
/ 22 марта 2012
Console.BackgroundColor = (ConsoleColor)Enum.Parse(typeof (ConsoleColor), s);
1 голос
/ 22 марта 2012

Просто чтобы добавить к использованию других * Enum.Parse метод , начиная с .NET 4.0 вы можете использовать универсальный метод Enum.TryParse для лучшей обработки недействительных значений:1007 *

public static void SetBG(string s)
{
    ConsoleColor color;

    if (!Enum.TryParse<ConsoleColor>(s, out color))
        throw new ArgumentException("s");

    Console.BackgroundColor = color;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...