如何重构这个switch语句?

4
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循环? - ATaylor
11
为什么不能使用Dictionary - Tim Schmelter
@ATaylor:难道不是无法在设置文件中存储集合吗? - John Smith
1
因为字符串的工作方式。咳咳。 - Erix
你从哪里获取下拉框的数据源? - Sergey Berezovskiy
@JohnSmith,你可以将任何可序列化的内容存储在设置文件中。 - Daniel A. White
3个回答

8
您可以使用包含在 Settings.Default 中的索引器(已测试过 .Net 4.0):
var liquidClass = Settings.Default[cmbLiquidClass.Text].ToString();

1
抢先一步了,我也想建议同样的事情。 - Denys Wessels

1

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

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

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

0

我猜你正在寻找一种将字符串“转换”为类名的方法。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接