4

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

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

我将使用很多控件,每个控件都有几种方法,例如Click, GetText, Exsists..

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

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;
        }

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

4

5 回答 5

2

我建议考虑创建一个“调度表”。您可以在此处查看 C# 示例:https ://stackoverflow.com/questions/715457/how-do-you-implement-a-dispatch-table-in-your-language-of-choice

于 2013-01-21T11:21:21.367 回答
0

为了使其类型更强(但这也引入了一些开销,因为您必须创建类),您可以为要获取的每个控件创建类并序列化/反序列化它们。

因此,您将拥有例如而不是 Item:

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

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

你可以根据他们拥有的类型做一个“switch case”。

于 2013-01-21T11:17:52.153 回答
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调用/覆盖执行命令,它将根据它的类型调用您的特定命令。

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

于 2013-01-21T11:27:24.380 回答
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
于 2013-01-21T12:12:07.723 回答
-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);
于 2013-01-21T11:25:08.520 回答