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

現在のクラスの内容をローカル変数に取得しようとしています。文字列の仕組み (値型のように振る舞う) のため、辞書を使用できません。選択した液体クラスを見つけるためにこれほど多くの行を必要としないように、これをリファクタリングする方法はありますか?

4

3 に答える 3

8

Settings.Default(.Net 4.0でテスト済み)の一部であるインデクサーを使用できます。

var liquidClass = Settings.Default[cmbLiquidClass.Text].ToString();
于 2012-12-13T21:40:56.680 に答える
1

これは、ラムダ マジックを使用して簡単に辞書に変換できます。

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

var liquidClass = stringsToSettings["LiquidClass1"]();
于 2012-12-13T21:30:45.557 に答える
0

I assume you're looking into a way of "converting" a string into a class name.

You could use reflection, which allows you to find a class by name, but it's slow and if you ever decide to rename your class in a future version, your code will not work.

Another way is having at some point of initialization a lookup Dictionary (the curse word!) which binds each class to a string.

于 2012-12-13T21:35:31.343 に答える