Как провести рефакторинг следующего переключателя в инструкции switch? - PullRequest
0 голосов
/ 10 ноября 2011

Любые идеи о том, как провести рефакторинг, следующие:

 private string GetErrorText(ErrorType type, int error, string id)
 {
     string errorMessage = string.Empty;

     switch (type)
     {
         case ErrorType.Generic:
             switch (error)
             {
                 case (int)ErrorType.One:
                 errorMessage = string.Format("Generic Error {0}",id);
                 break;
                 case (int)ErrorType.Two:
                 errorMessage = "Generic Error 2.";
                 break;
             }
             break;
             case ErrorType.NonGeneric:
                    switch (error)
                    {
                        case (int)NonGenericError.One:
                            errorMessage = "One";
                            break;
                        case (int)NonGenericError.Two:
                            errorMessage = "Two";
                            break;
                        case (int)NonGenericError.Three:
                            errorMessage = "Three";
                            break;
                        case (int)NonGenericError.Four:
                            errorMessage = "Four"
                            break;
                    }
                    break;
            }
            return errorMessage;
        }

Я знаю, что, вероятно, я могу просто вернуть строку вместо использования ключевого слова break.Я слышал, что могу поместить это в словарь, чтобы полностью избежать переключения.Кроме того, можно ли сочетать операторы switch?И что происходит в том случае, если мне нужно передать более одного аргумента в метод string.Format.Прямо сейчас, это займет всего один?

Ответы [ 3 ]

0 голосов
/ 10 ноября 2011

Одно очевидное наблюдение заключается в том, что значение «type» не имеет значения - вы можете просто включить один параметр «error».

string.Format принимает столько аргументов, сколько необходимо, например,

errorMessage = string.Format("Generic Error {0}. Other data {1}. ", id, otherData);
0 голосов
/ 10 ноября 2011

Почему бы и нет?

string GetGenericErrorText(ErrorType error, string id)
{
   switch (error)              
   {
       case ErrorType.One:
           return string.Format("Generic Error {0}",id);

       default:
           return "Generic Error 2.";
    } 
}

и

string GetNonGenericErrorText(NonGenericError error)
{
   case NonGenericError.One:
       return "One";

   case NonGenericError.Two:
       reutrn "Two";

   case NonGenericError.Three: 
       return "Three";

   default: 
       return "Four";
}

РЕДАКТИРОВАТЬ

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

string GetNonGenericErrorText(NonGenericError error)
{
    return error.ToString();
}
0 голосов
/ 10 ноября 2011

Довольно распространенный способ связать строковое значение с enum - использовать пользовательский атрибут и просматривать его во время выполнения с отражением.Вот хорошее объяснение .

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

...