4

HTMLコントロールで実行する必要のある特定の手順とアクションを含むxmlファイルがあります。

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

私が使用するコントロールはたくさんあり、各コントロールには、、、などのいくつかのメソッドがClickありGetTextますExsists

現在、スイッチを使って対処していますが、これは良い習慣ではないと聞きました。特定のコントロールを選択するためのスイッチが1つあり、各コントロールには特定のメソッドを呼び出すためのスイッチがあります。

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

より強く型付けするために(ただし、クラスを作成する必要があるという点でオーバーヘッドが発生します)、取得するコントロールごとにクラスを作成し、それらをシリアライザー/デシリアライズできます。

したがって、アイテムの代わりに、たとえば次のようになります。

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

それらはすべて同じ基本クラスから継承するか、同じインターフェイスを実装するため、最終的には逆シリアル化されたIMyControlsを取得します:)

そして、あなたは彼らが持っているタイプに基づいて「スイッチケース」を行うことができます。

于 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、実行コマンドを呼び出し/オーバーライドします。これにより、コマンドのタイプに基づいて特定のコマンドが呼び出されます。

実行する操作に応じて、基本制御クラスを継承する別のタイプを作成し、executeコマンドをオーバーライドしてアクションを呼び出します。うまくいけば、これは役に立ちますか?

于 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 に答える