如何在switch语句中重构以下开关?

时间:2011-11-10 16:39:04

标签: c# switch-statement

有关如何重构以下内容的任何想法:

 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 :(得分:0)

将字符串值与enum相关联的一种相当常见的方法是使用自定义属性,并在运行时使用反射查找它。这是一个good explanation

当然,在实践中使用反射会比使用条件更慢。

答案 1 :(得分:0)

一个明显的观察结果是“类型”的值无关紧要 - 你可以只有一个“错误”开关。

string.Format根据需要获取尽可能多的参数,例如

errorMessage = string.Format("Generic Error {0}. Other data {1}. ", id, otherData);

答案 2 :(得分:0)

为什么不呢?

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();
}