过度使用switch语句开销

时间:2013-01-21 11:16:19

标签: c# switch-statement

我有xml文件,其中包含必须在html控件上执行的特定步骤和操作:

<Item control="Dropdown" action="Click" value=""/>
<Item control="Button" action="GetText" value=""/>
<Item control="Input" action="WriteText" value="Sample Text"/>

我将使用很多控件,每个控件都有多种方法,如ClickGetTextExsists ..

目前我使用开关来处理它,但我听说这不是一个好习惯。我有一个开关来选择特定控制,并且每个控件都切换到调用特定方法。

switch (control)
            {
                case "button":
                    return new Button;
                case "table":
                    return new Table;
                (...)
            }

(...)


        switch (action)
        {
            case "click":
                this.Click();
                return true;
            case "gettext":
                this.GetText();
                return true;
            default:
                return false;
        }

我没有太多编码经验,所以我不确定这是否是处理这个问题的好方法。你能给我一些建议怎么做得更好吗?也许有一些编码模式在这里有用吗?

5 个答案:

答案 0 :(得分:2)

我建议考虑创建一个&#34; Dispatch Table&#34;。你可以在这里看到一个C#示例:https://stackoverflow.com/questions/715457/how-do-you-implement-a-dispatch-table-in-your-language-of-choice

答案 1 :(得分:0)

为了使它更强类型化(但这也带来了一些开销,你必须创建类),你可以为你想要获得的每个控件创建类,并对它们进行序列化/反序列化。

所以不要使用例如:

<Button action="Click" value="" />

它们都将从相同的基类继承或实现相同的接口,因此最终您将获得反序列化的IMyControls:)

你可以根据他们的类型做一个“切换案例”。

答案 2 :(得分:0)

public class BaseControl
{
  public object Click(){ }
  public object GetText() { }
  public virtual object ExecuteCommand() { }
}
public class TableControl : BaseControl
{
  public override object ExecuteCommand()
  {
    //Do your method
    return base.GetText();
  }
}

然后返回TableControl而不是Table并调用/覆盖执行命令,它将根据它的类型调用您的特定命令。

创建一个继承基本控件类的其他类型,具体取决于您要执行的操作,覆盖executecommand并调用该操作。希望这有帮助吗?

答案 3 :(得分:0)

您可以为每种类型的控件创建一个类

namespace SomeNamespace {
    class Button {
    }
    public void Click(){
    }
}

然后当你阅读XML

//assemblyName is the full name of the assembly holding your control classes
var type = System.GetType(assemblyName, "SomeNamespace." + control);
var control = Activator.CreateInstance(type); //requires a default constructor
type.GetMethod(methodName).Invoke(control); //methodName could be click

答案 4 :(得分:-1)

如果您可以重命名控件的名称以与类名匹配,则可以通过反射创建实例;

string controlName = "System.Windows.Forms.Button";
Assembly assembly = typeof(Form).Assembly; 
Type type = assembly.GetType(controlName);
object controlObject = Activator.CreateInstance(type);

此外,您也可以通过反射调用方法;

MethodInfo methodInfo = controlObject.GetType().GetMethod("Method Name");
methodInfo.Invoke(controlObject,null);