2

「レベル + インデックス ()」のように、このコードをすべて 1 行にまとめることはできますか?

私はこのスイッチ機能を持っています:

switch(index)
    {
        case 1:
        Level1();
        break;
        case 2:
        Level2();
        break;
        case 3:
        Level3();
        break;
        case 4:
        Level4();
        break;
        case 5:
        Level5();
        break;
    }

ご覧のとおり、各インデックスは、"Level" という名前とインデックス番号を持つ関数を呼び出します。

4

5 に答える 5

10

そうじゃない、いいえ。デリゲートを使用できます:

// Ideally make this a readonly field.
Action[] actions = { Level1, Level2, Level3, Level4, Level5 };
...
actions[index - 1]();

または、他の人が言及したように、リフレクションを使用することもできます...しかし、特にパフォーマンスが懸念される場合は、可能であればそれを避けようとします。

奇妙なデザインのように感じますが、一歩下がって、これを最初に設計するためのよりクリーンな方法があるかどうかを検討します. (現時点では、これ以上のコンテキストがなければ、それを支援することは困難です。)

于 2013-10-03T12:31:47.840 に答える
6

これを試して:

typeof(yourClassCOntainingLevel1Method).GetMethod("Level"+index).Invoke(this,null); 

yourClassCOntainingLevel1MethodLevel1メソッドを持つクラス名です

呼び出しと同じクラスにある場合:

typeof(this).GetMethod("Level"+index).Invoke(this,null); 
于 2013-10-03T12:30:49.883 に答える
4

The only way to achieve this is through Reflection. But it would be better to have a single Level function that takes the level as parameter:

public void Level(int number)
{
    ...
}
于 2013-10-03T12:30:25.433 に答える
1

以下のコード スニペットを試してみてください。

Type thisType = this.GetType();
MethodInfo theMethod = thisType.GetMethod("Level"+index);
theMethod.Invoke(this, userParameters);
于 2013-10-03T12:32:01.340 に答える
0

最善の方法は、Jon Skeet が回答するデリゲートだと思います。また、リフレクションを使用することもできますが、パフォーマンスが低下するためベスト プラクティスではありません。

于 2013-10-03T12:44:38.047 に答える