我可能會對此稍加反思,但我可以使用一些幫助來確定一種方法/執行以下操作的最佳方法。將變量捕獲到事件處理程序中
我有一個事件處理程序附加到另一個類的屬性的對象。在我的事件處理函數中,我需要關於引起事件的對象的附加元數據(即包含它的對象的ID)。從發件人和活動信息無法獲取我需要的信息。我的傾向是,這將是一個使用捕獲變量的好地方,但我不確定我的實現想法。
所以在代碼中說明我有一個事件處理程序:
void MyEventHandler(object sender, EventArgs e){
//Do Stuff here
}
(由於我使用基地的EventArgs在這裏,但我的實際執行情況的說明的是一個專門的子類,並使用聲明的事件通用事件處理程序)
我目前安裝這樣的:
topObject.SubObject.EventToHandle += MyEventHandler;
我後來detatch它像這樣:
topObject.SubObject.EventToHandle -= MyEventHandler;
我想topObject的,當我處理事件,所以我準備換一個MyEventHandler有以下特徵碼編號:
void MyEventHandler(int id, object sender, EventArgs e)
和附加事件處理程序是這樣的:
topObject.SubObject.EventToHandle += (s,e) => MyEventHandler(topObject.ID, s,e);
我對此的擔憂是雙重的。
- 是否有問題的範圍,處理程序將實際消失而不會刪除,一旦我在這附加功能之外。我以前在使用lambda表達式時發現了一些奇怪的錯誤,在這些錯誤中事件處理程序在我身上消失了。並非所有的時候,只是在某些情況下。任何人都可以啓發我這些案件可能是什麼,所以我知道它何時可以安全地使用我的語法。
- 我不記得確切,但我不認爲如果我使用這種語法,我可以刪除事件處理程序,因爲創建的隱式對象不相同。
由於這兩個問題,我的想法是創建一個Action並保存該操作並使用它,直到我需要刪除該事件處理程序。我做了以下內容:
Action<object, EventArgs> handler = (s,e) => MyEventHandler(topObject.ID, s,e);
topObject.SubObject.EventToHandle += handler;
我得到的行動不能被鑄造到事件處理程序。是否有一些簡單的方法可以進行這種轉換,以確保我可以分離事件處理程序?我剛剛想過這個/有沒有一種方法我現在沒有看到這樣做?
有什麼不妥的做法是我處理我不控制的對象,並且子對象不知道它的topobject。如果我有這個訪問權限,這個cleary將是一個非問題 – 2010-12-09 13:17:38