我經常遇到下面的代碼的持續時間的事件:訂閱了使用塊
myService.SomeEvent += listener;
myService.DoSomething();
myService.SomeEvent -= listener;
這是偉大的,但它會是很好,如果我們能做到這一點的一個更好的方式。我想在做類似的:
using(EventScope.Start(myService.SomeEvent, listener)){
myService.DoSomething();
}
不幸的是,這是由C#禁止,因爲myService.SomeEvent只能出現在一個+ =或左邊 - =(有很好的理由)。我的問題是我有什麼其他選擇?理想情況下,我想這是類型安全的,這就排除了反射和做以下(這我已經實現):
using(EventScope.Start(myService, "SomeEvent", listener){
myService.DoSomething();
}
要清楚我沒有結婚,以使用「使用」語法,並且可以說你可以說這是對語言的顛覆。其他選項將不勝感激!
是的,它看起來最好的結果就是傳遞一個字符串並從中構造一個EventInfo對象。 – Noldorin 2009-06-12 18:32:32
我當時希望情況並非如此......它工作正常,但並不理想。 – jonnii 2009-06-12 18:39:47
作爲一個風格問題,我會用try-finally來解決這個問題。這強調,該操作的_semantics_是「訂閱事件,做事情,總是取消訂閱」。使用一次性物品強調「這件事有需要積極清理的資源」。我不喜歡混合程序語義和清理機制。我認爲我不會像「變態」那樣遠,但至少是一種糟糕的嗅覺行爲。 – 2009-06-13 05:40:51