2012-01-05 57 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)); 
}