3

UIクラスが混乱しているように見えるので、私が取り組んでいるプロジェクトをもう少し読みやすくしようとしています。私が直面している新しい問題は、StatusStrip、MenuStrip、および ToolStrip コントロールにあります。

すべてのボタンは異なることを行う必要があるため、これは現時点では switch ステートメントで制御されています。以下に例を示します。

switch (e.ClickedItem.Text.ToLower())
{
    case "find":
        {
            Find find = new Find(customTextBox1);
            find.Show();
            break;
        }
    case "undo":
        {
            customTextBox1.Undo();
            break;
        }
    case "redo":
        {
            customTextBox1.Redo();
            break;
        }
    case "cut":
        {
            customTextBox1.Cut();
            break;
        }
    case "copy":
        {
            customTextBox1.Copy();
            break;
        }
    case "paste":
        {
            customTextBox1.Paste();
            break;
        }
    case "delete":
        {
            customTextBox1.SelectedText = "";
            break;
        }
    case "refresh":
        {
            RefreshData();
            break;
        }
    case "select all":
        {
            customTextBox1.SelectAll();
            break;
        }
}

上記のコードは 1 つのアイテムのためのものなので、それぞれ 5 ~ 10 個のサブアイテムを持つ 20 個のアイテムがあると想像してください。

ご覧のとおり、ケースメソッドは既に片付けており、現在はほとんどがワンライナーですが、それでもサブアイテムの量が多いため、これを行うより良い方法であるように感じます. 理想的には、この問題を処理する新しい/より良い方法を探しています。

前もって感謝します。

4

1 に答える 1

3

次のコードを使用できますが、文字列が関数名とまったく同じであることを確認する必要があります

switch (e.ClickedItem.Text.ToLower())
{
    case "find":
        Find find = new Find(customTextBox1);
        find.Show();
        break;
    case "undo": case "redo": case "cut": case "copy": case "paste": case "select all":
        Type thisType = customTextBox1.GetType();
        MethodInfo theMethod = thisType.GetMethod(e.ClickedItem.Text.ToLower());
        theMethod.Invoke(customTextBox1, userParameters);
        break;
    case "delete":
        customTextBox1.SelectedText = "";
        break;
    case "refresh":
        RefreshData();
        break;
}
于 2012-07-28T06:48:35.647 に答える