несколько - условные операторы c#




Почему оператор if работает, но не оператор switch (3)

Вы не можете иметь выражения в случае (до C # 7), но вы можете в переключателе, так что это будет работать:

switch (ConvertToMessageCode(msgComingFromFoo[1]))
{
    case Message.Code.FOO_TRIGGER_SIGNAL:
        break;
}

Где вам нужно будет написать ConvertToMessageCode чтобы выполнить необходимое преобразование в перечисление Message.Code . ConvertToMessageCode просто абстрагирует детали преобразования, вы можете обнаружить, что вам не нужен отдельный метод, но он может обойтись с встроенным кодом в операторе switch, например, приложением.

Я пытаюсь создать оператор switch используя индекс char строки и Enum, используя this оболочку, чтобы получить значение выбранного перечисления из описания. В значительной степени это позволяет хранить строку до значения перечисления.

Вот мой оператор if :

if (msgComingFromFoo[1] == Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()))
{
    //foo
}

и вот моя инструкция switch :

switch (msgComingFromFoo[1])
{
    case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()):
        break;
}

Почему он принимает оператор if а не switch ? Я попытался преобразовать его в char, так как я выбрал индекс из строки, но, к сожалению, это не сработало.

Обновить:

Вот сообщение Message.Code

public class Message
{
    public enum Code
    {
        [Description("A")]
        FOO_TRIGGER_SIGNAL
    }
}

Как вы можете видеть, мне нужно описание, присвоенное перечислению, а не значение перечисления, равное 0. Использование Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString() из указанной оболочки возвращает A не 0


Ошибка:

Ожидается постоянное значение


Чтобы добавить к ответу @ code-apprentice.

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

Что-то вроде:

public interface IMessageLogic 
{
   void ProcessMessage()
}

public class TriggerSignal : IMessageLogic 
{
   public void ProcessMessage() 
   {
       // Do trigger stuff
   }
}

public class FooMessage : IMessageLogic 
{
   public void ProcessMessage() 
   {
       // Do foo stuff
   }
}

public class MessageHandler
{
    public void HandleMessage(IMessageLogic messageLogic)
    {
        messageLogic.ProcessMessage();
    }
}

public static void Main()
{
    IMessageLogic messageLogic = GetMessage();
    var handler = new MessageHandler();

    handler.HandleMessage(messageLogic);
 }

Шаблон посетителя


case в инструкции switch должен ссылаться на постоянное значение. Вы не можете оценить выражение в case .





switch-statement