Использование свойств в случаях оператора switch?

2

У меня есть оператор 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, но компилятор жалуется...

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

Теги:
switch-statement
refactoring

6 ответов

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

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

2

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

public class Command1 
{
   public string const Code = "#CODE1";
}
1

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

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

CommandEnum myCommand;
//...
switch (myCommand)
{
  case myCommand.CommandOne:
       return new Command1();
  case myCommand.CommandTwo:
       return new Command2();
  //...
}
0

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

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

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

  • 0
    Нет, не так плохо ...... Я должен был сделать это :) Я пошел со статической переменной только для чтения под названием «Код»
0

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

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

0

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

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

#CODE1
#CODE2

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

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

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

НТН

  • 0
    Мне не нравится иметь строковые константы, которые нужно «запомнить». Я хочу, чтобы они были прикреплены к соответствующим командам. Там нет возможности опечатки таким образом. Интеллисенс поймает их.
  • 0
    Правда, но вы все еще можете иметь опечатки в вашем файле кода. Смысл в том, чтобы делать то, что вы хотите, вы должны сначала создать экземпляр переменной. Вы не можете создать новый экземпляр после проверки значения свойства, вы должны создать экземпляр, прежде чем сможете проверить свое значение.
Показать ещё 1 комментарий

Ещё вопросы

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