Использование свойств в случаях оператора switch? - PullRequest
2 голосов
/ 04 августа 2009

У меня есть оператор switch в одном классе, который генерирует объекты Command, основываясь на том, соответствует ли определенная строка в файле кода конкретному коду для этого объекта Command.

как это:

switch (line):
{
   case "#CODE1":
      return new Command1();
   case "#CODE2":
      return new Command2();
}

Я хочу превратить это в нечто подобное:

switch (line):
{
   case Command1.Code:
      return new Command1();
   case Command2.Code:
      return new Command2();
}

Я пытался создать открытое статическое свойство Command1, но компилятор жалуется ...

Есть ли способ сделать что-то в этом духе, на что компилятор не будет жаловаться?

Ответы [ 6 ]

9 голосов
/ 04 августа 2009

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

2 голосов
/ 04 августа 2009

Переключатель работает только с числовыми типами и строковыми типами, но не со свойствами. Вы можете попытаться определить общедоступную строковую константу в ваших классах Command1 и Command2, которую вы сможете включить вместо этого.

public class Command1 
{
   public string const Code = "#CODE1";
}
1 голос
/ 04 августа 2009

, так как вы работаете со строками, я не уверен, что это лучший подход, но использование enums работает для меня

enum CommandEnum { CommandOne, ComandTwo, CommandN }
//...

CommandEnum myCommand;
//...
switch (myCommand)
{
  case myCommand.CommandOne:
       return new Command1();
  case myCommand.CommandTwo:
       return new Command2();
  //...
}
0 голосов
/ 05 августа 2009

Вы всегда можете вернуться к проверенному и истинному блоку if / else

 if (line == Command1.Code)
  return new Command1();
 else if (line == Command2.Code)
  return new Command2();

Это не так плохо, не так ли?

0 голосов
/ 05 августа 2009

Если вы хотите проверить свойства класса. Я предполагаю, что вы, вероятно, хотите иметь возможность изменить эти свойства и проверить соответственно. Вам придется использовать оператор if, else if, else if.

Если у вас есть jones для использования оператора switch, вы SOL, если вы не проверяете целочисленный тип на постоянные значения. если, еще, если, еще, если блоки некрасивые, но это сделает то, что вы ищете.

0 голосов
/ 05 августа 2009

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

Я предполагаю, что у вас есть файл кода с токенизированными инструкциями, например:

#CODE1
#CODE2

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

Вы заставили его работать, но вместо того, чтобы выполнять прямое сравнение строк с токеном в файле, вы хотите, чтобы значение токена хранилось в свойстве ваших объектов? Проблема с этим подходом заключается в том, что вы должны создать новый экземпляр вашего объекта (команды 1 и 2), прежде чем сможете ссылаться на значения их свойств.

Если я понимаю, что вы сделали и что вы хотите сделать, я думаю, что ваше решение было таким же, каким оно было. Я не уверен на 100%, что я действительно понимаю, что вы хотите сделать, или почему.

НТН

...