【问题标题】:How to refactor this switch statement?如何重构这个 switch 语句?
【发布时间】:2012-12-13 21:25:22
【问题描述】:
string liquidClass = string.Empty;

switch (cmbLiquidClass.Text)
{
    case "LiquidClass1":
        liquidClass = Settings.Default.LiquidClass1;
        break;
    case "LiquidClass2":
        liquidClass = Settings.Default.LiquidClass2;
        break;
    case "LiquidClass3":
        liquidClass = Settings.Default.LiquidClass3;
        break;
    case "LiquidClass4":
        liquidClass = Settings.Default.LiquidClass4;
        break;
    case "LiquidClass5":
        liquidClass = Settings.Default.LiquidClass5;
        break;
    case "LiquidClass6":
        liquidClass = Settings.Default.LiquidClass6;
        break;
    case "LiquidClass7":
        liquidClass = Settings.Default.LiquidClass7;
        break;
    case "LiquidClass8":
        liquidClass = Settings.Default.LiquidClass8;
        break;
    case "LiquidClass9":
        liquidClass = Settings.Default.LiquidClass9;
        break;
}

试图进入一个局部变量当前类的内容。由于字符串的工作方式(表现得像值类型),我不能使用字典。有什么方法可以重构它,以便不需要这么多行来找到所选的液体类?

【问题讨论】:

  • 使用数组和for循环?
  • 为什么你不能使用Dictionary
  • @ATaylor:是不是不能在设置文件中存储收藏?
  • @TimSchmelter 因为字符串的工作方式。呵呵。
  • 从哪里获得组合框的数据源?

标签: c# refactoring switch-statement


【解决方案1】:

您可以使用属于Settings.Default 的索引器(使用.Net 4.0 测试):

var liquidClass = Settings.Default[cmbLiquidClass.Text].ToString();

【讨论】:

  • 打败我,我会提出同样的建议
【解决方案2】:

您可以使用一些 lambda 魔法轻松地将其转换为字典。

Dictionary<string, Func<string>> stringsToSettings = new ...
stringsToSettings.Add("LiquidClass1", () => Settings.Default.LiquidClass1);

var liquidClass = stringsToSettings["LiquidClass1"]();

【讨论】:

    【解决方案3】:

    我假设您正在研究一种将字符串“转换”为类名的方法。

    您可以使用反射,它允许您按名称查找类,但速度很慢,如果您决定在未来版本中重命名您的类,您的代码将无法正常工作。

    另一种方法是在初始化的某个点有一个查找字典(诅咒词!),它将每个类绑定到一个字符串。

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多