我有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;
}
我没有太多编码经验,所以我不确定这是否是处理这个问题的好方法。你能给我一些建议怎么做得更好吗?也许有一些编码模式在这里有用吗?
答案 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);