修剪switch语句

时间:2012-07-28 06:37:54

标签: c# winforms

我一直在尝试使项目我的工作更具可读性,因为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;
        }
}

以上代码只适用于一个项目,因此想象其中有20个项目各有5-10个子项目。

我已经清理了案例方法,你可以看到,现在大多数都是单行,但仍然有这么多的子项,感觉它应该是一个更好的方法。理想情况下,我正在寻找一种新的/更好的方法来解决这个问题。

提前致谢。

1 个答案:

答案 0 :(得分: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;
}