2012-01-05 22 views
3

私は起動時にサーバーから何らかの情報を要求するオブジェクトを持っています。これは、返信で同じであるメッセージと共に識別子を送信するので、正しいメッセージに応答しているかどうかを確かめることができます。現在のところ、コードはおおよそ次のようになります。デリゲートに余分な引数を渡す

void GetInitialData() 
{ 
    string guid = Guid.NewGuid().ToString(); 
    Communicator.NewMessage += (sender, e) 
    { 
     if(e.Message.Id == guid) 
     FillInfo(); 
    }; 
Communicator.SendMessage(new Message(stuff, guid)); 
} 

これは動作しますが、このデータは一度しか必要とされているように、私はあなたがラムダを行うことができない、その後のイベントから退会したいと思います。代わりに別の関数を使用すると、これで私は登録を解除できますが、関数にパラメータを渡す唯一の方法はクラス変数を使うことです。

string guid; 

void GetInitialData() 
{ 
    Communicator.NewMessage += MessageReceived; 
    Communicator.SendMessage(new Message(stuff, guid)); 
} 

void MessageReceived(object sender, MessageArgs e) 
{ 
    if(e.Message.Id == guid) 
    { 
    FillInfo(); 
    Communicator.NewMessage -= MessageReceived; 
    } 
} 

これを回避する方法はありますか?私は退会させ、余分な変数でクラスを混乱させることはありませんか?

+0

、私はどんなメリットが表示されません。いくつかの方法では、このケースではデータを保持しなければならないイベントe。そして、そのいくつかの情報から、ある種のものでなければなりません。したがって、MessageArgsタイプ。なぜそれを避けたいですか?もしそうなら、どういったタイプのイベントが生成されたのかを知りたいのですか? – Zenwalker

答えて

4

あなたが最初の変数に格納したときにラムダの登録を解除することができます:それでも

void GetInitialData() 
{ 
    EventHandler<EventArgs> handler = null; 

    handler = (sender, e) => 
    { 
     if(e.Message.Id == guid) 
     { 
      FillInfo(); 
      Communicator.NewMessage -= handler; 
     } 
    }; 

    string guid = Guid.NewGuid().ToString(); 
    Communicator.NewMessage += handler;; 
    Communicator.SendMessage(new Message(stuff, guid)); 
} 
関連する問題