2012-12-13 2 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

배열과에 대한 루프를 사용? – ATaylor

+11

_Why_ '사전'을 사용할 수 없습니까? –

+0

@ATaylor : 설정 파일에 컬렉션을 저장할 수없는 경우가 아닙니까? –

답변

8

당신은 Settings.Default의 일부입니다 인덱서를 사용할 수있다 (닷넷 4.0 테스트) :

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

나에게 이길 지, 같은 것을 제안하려고했다. –

1

일부 람다 마법을 사용하여 쉽게 사전으로 변환 할 수 있습니다.

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

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

아, 람다가 고마워 할 것입니다. –

0

난 당신이 클래스 이름에 문자열을 "변환"의 방법으로 찾고 가정합니다.

리플렉션을 사용하면 이름으로 클래스를 찾을 수 있지만 속도가 느리며 이후 버전에서 클래스 이름을 바꾸려면 코드가 작동하지 않습니다.

또 다른 방법은 각 클래스를 문자열에 바인드하는 조회 사전 (저주 단어!)을 초기화하는 것입니다.

관련 문제