如何重构这个switch语句?

时间:2012-12-13 21:25:22

标签: c# refactoring switch-statement

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

尝试将当前类的内容输入到局部变量中。由于字符串的工作方式(行为类似于值类型),我无法使用字典。有没有办法重构这个,以便它不需要这么多行来找到所选的液体类?

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

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