1

私は C# の初心者で、シリアル通信を使用する動的 GUI を実装する方法に取り組んでいました。私はもともと C 出身なので、関数ポインタの概念はよく知っています。

基本的に、シリアル コマンドが処理されたときに answerFunction() 関数を呼び出したいと思います。理論
的には、実行時に動的に作成されるクラス lbl_txtBox_Pair があります。
シリアル ポートと通信するクラス comObject があります。
1 つのシリアル コマンドに関するすべての情報を保持する 3 番目のクラスの comPacket があります。

  1. クラス lbl_txtBox_Pair のオブジェクトで、Packet をインスタンス化し、シリアル コマンドの終了時にどの関数を呼び出す必要があるかを伝えます。
  2. パケット オブジェクトを comObject インスタンスに渡します。
  3. 処理された後、comObject は、Packet オブジェクトに格納されているデリゲートを呼び出すことによって、パケットの元の送信者に通知したいと考えています。

何らかの理由で、私はそれを機能させることができません。Packet の Attribute は呼び出し可能ではないことがわかります。私は何かひどく間違ったことをしていますか?

コードは次のとおりです。まず、クラス "lbl_txtBox_Pair" のコードです。ここで comPacket を作成し、それを comObject に渡します。

public delegate void answerHandler( comPacket packet);
public void txb_value_KeyPress(object sender, KeyPressEventArgs e)
{
   if (e.KeyChar == (char)Keys.Return)
   {
      answerHandler answerMethod = new answerHandler(this.processAnswer);
      comPacket question = new comPacket(this.command, answerMethod, 1);
      comObject.addPacket(question);
    }
 }

comPacket のコンストラクター。ここで、デリゲートは後で呼び出されるように格納されます。

public Delegate answerFunction;
public comPacket(string cmd, Delegate func, int prio)
{
    this.cmd = cmd;
    answerFunction = func;
    this.prio = prio;
}

comObject では、パケットが処理されます。終了したら、パケットに格納されている関数を呼び出したいと思います。ちなみに、comObject は別の Thread で実行されます。

if (this.isEndtocken(inputline))
 {
    listen = false;
    packet.answerFunction(packet);
 }

そして、これが壊れた場合です。packet.answerFunction(パケット); 実行されず、メソッドとして呼び出すことはできないと言います。

どこが間違っているのか誰にもわかりますか?デリゲートがデリゲートか何かであるという情報を失っているように見えると思います。それとも、他のタイプのコールバック / イベント メソッドを使用するようにコードを完全に再構築する必要がありますか?

4

2 に答える 2

2

comPacket強く型付けされたデリゲートを取るように変更します。

public answerHandler answerFunction;
public comPacket(string cmd, answerHandler func, int prio)
{
    this.cmd = cmd;
    answerFunction = func;
    this.prio = prio;
}

デリゲート参照を弱く型付けしたままにしたい場合は、DynamicInvoke代わりに活用できます: http://msdn.microsoft.com/en-us/library/system.delegate.dynamicinvoke.aspx

編集: 厳密に型指定されたデリゲートを維持したいが、使用方法が異なる場合の別のオプションは、ジェネリックを活用することです。デリゲートをジェネリック クラスに格納し、そのシグネチャをそのジェネリック型に関連付けることができます。

于 2012-10-12T11:11:42.167 に答える
0

コメントを残すことができないため、代わりにこれを回答として投稿する必要があります。デリゲート (およびイベントなど) は、通常、それらを含むオブジェクトによってのみ「呼び出す」ことができます。

だからあなたが持っているなら

class MyClass {
    public event Action someEvent;
    // you can also replace Action with the name of your delegate type
}

そしてあなたはやろうとします

MyClass x = new MyClass();
x.someEvent.Invoke();

それではエラーです。他のオブジェクトがイベントを呼び出せるようにしたい場合は、次のMyClassようにメソッドを追加する必要があります。

public void InvokeMyEvent() {
    someEvent.Invoke();
}

(静的イベントに対してこれを行う必要があるかどうかは忘れました)

于 2012-10-12T11:42:59.037 に答える