2012-12-13 105 views
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; 
} 

試圖獲取當前類的內容。由於字符串的工作方式(行爲類似於值類型),我無法使用字典。有什麼方法可以重構這個,以便它不需要這麼多的線來找到所選的液體類?如何重構這個switch語句?

+0

使用一個陣列和一個for循環? – ATaylor

+11

_Why_你不能使用'Dictionary'嗎? –

+0

@ATaylor:難道你不能在Settings文件中存儲集合嗎? –

回答

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"](); 
+0

啊,是的,lambda會工作,謝謝。 –

0

我假設你正在研究一種將字符串「轉換」爲類名的方法。

您可以使用反射,它允許您按名稱查找類,但速度很慢,如果您決定在將來的版本中重命名類,則代碼將無法工作。

另一種方法是在初始化的某個位置使用一個將每個類綁定到一個字符串的查找字典(curse word!)。