次のスイッチを短く読みやすいコードで記述する方法はありますか?
switch (SomeValue)
{
case "001": return DoMethod1(); break;
case "002": return DoMethod2(); break;
//etc..
}
みたいな感じで考えていました
Dictionary<string, Func<int>> MethodsByValue = new Dictionary<string, Func<int>>()
{
{ "001", DoMethod1 },
{ "002", DoMethod2 },
}
これを呼び出す
return MethodsByValue[SomeValue]();
しかし、これは可能ですか?それとも、私は箱から遠く離れた方法を考えていますか. このようなものは見つかりませんでしたが、可能であればキーワードがわかりません。
編集: Lasse V. Karlsen の要求に答えるには:
これが私のプロジェクトのコードです。いくつかの場所で名前が変更されたため、元の名前は問題ではありません。母国語だからです。
public string GetRecord420(Dictionary<DataClass, object> dictionaryName)
{
// some code here
}
public string GetRecord421(Dictionary<DataClass, object> dictionaryName)
{
// some code here
}
//(Temperary) solution with the switch statement in a wrapper:
public string GetRecordByString(string s, Dictionary<DataClass, object> dictionaryName)
{
switch (s)
{
case "320": return GetRecord420(dictionaryName);
case "321": return GetRecord421(dictionaryName);
default: return String.Empty;
}
}
//How I hoped it could be, with a mapping dictionary.
public Dictionary<string, Func<string, Dictionary<DataClass, object>>> MethodByString =
new Dictionary<string, Func<string, Dictionary<DataClass, object>>>()
{
{ "320", GetRecord420 },
{ "321", GetRecord421 },
}
DataClass は、一部の列データ (列名、列タイプなど) を格納する Entity クラスです。
ディクショナリの部分を試しましたが、次のエラーが表示されます: メソッド グループから System.Func<...> に変換できません。
() => GetRecord420 に変更すると、次のエラーが表示されます: ブロック内の戻り値の型の一部がデリゲートの戻り値の型に暗黙的に変換できないため、ラムダをデリゲート型 System.Func<...> に変換できません。