2009-08-04 2 views
2

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

так:

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

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

ответ

9

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

2

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

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

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

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

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

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

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

#CODE1 
#CODE2 

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

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

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

НТН

+0

Мне не нравится, когда строковые константы должны быть «запомнены». Я хочу, чтобы они были привязаны к их соответствующим командам. Такой возможности нет. Intellisense поймает их. –

+0

Правда, но у вас все еще есть опечатки в вашем файле кода. Дело в том, чтобы делать то, что вы хотите, сначала нужно создать экземпляр переменной. Вы не можете создать новый экземпляр после проверки значения свойства, вам нужно создать экземпляр, прежде чем вы сможете проверить свое значение. – Beth

+0

После прочтения вашего комментария ниже, я не уверен, почему компилятор будет жаловаться на оператор switch, а не if/then/else. Я думал, что он жалуется на вашу ссылку на объект, хотя это было неясно. Если вы получили его для работы с структурой if/then/else, и вы изменили его обратно на переключатель, вы все еще получаете ошибки от компилятора? – Beth

0

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

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

0

Вы всегда могли упасть обратно на верный и, если/иначе блок

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

Это не так зло, это?

+0

Нет, не так злой ...... Я должен был это сделать :) Я пошел со статической переменной readonly с именем «Code» –

Смежные вопросы