2010-05-03 105 views
1

在C#中可以這樣做嗎?可能與表達式。 EventHandlers不是控件或我擁有的任何類的成員。自動取消訂閱事件

例如爲:

Microsoft.Win32.SystemEvents.SessionSwitch += new Microsoft.Win32.SessionSwitchEventHandler(SystemEvents_SessionSwitch); 

的事件處理程序是,我沒有自己的靜態引用。我如何將這種類型的語句傳遞給以下函數?

private void RegisterEvent(EventHandler handler, Action<EventArgs> action) 
{ 
    handler += action; 
    m_toUnsubscribe.Add(handler, action); 
} 

... in Dispose() 
{ 
    foreach(var pair in m_toUnsubscribe) 
    { 
    pair.handler -= pair.action; 
    } 
} 
+0

「可能帶有表達式」:您認爲什麼? – 2010-05-04 15:59:59

+0

我可能無法在基本EventHandler上使用+ =和 - =運算符,因此我可能必須將整個+ =和 - =表達式編寫爲匿名函數: RegistertEvent(()=> SomeEvent + = SomeReaction, ()=> SomeEvent- = SomeReaction) – 2010-05-04 19:47:47

回答

3

就像論壇線程中描述的那樣,您可以在對象的dispose方法中將事件設置爲null。當然,這要求你的班級實施IDisposable。

下面的鏈接:http://channel9.msdn.com/forums/TechOff/148255-Event-disposal/

+0

我沒有這個事件,所以我不能將它設置爲null。 – 2010-05-05 22:26:45

0

你可以看看this後,用我張貼的答案。 Suppress功能將從控件中刪除處理程序。你可以修改這些以適應你的需求。

+1

實際的URL:http://stackoverflow.com/questions/91778/how-to-remove-all-event-handlers-from-a-control/1597332#1597332 – 2010-05-03 20:21:08

+0

這不是一個控制,我不擁有傳遞給RegisterEvent的事件。 – 2010-05-05 22:27:06