2012-01-05 59 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 2012-01-05 07:54:22

回答

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