2016-04-21 14 views
-2

我有一種情況,多個類正在註冊與另一個類的興趣,觀察某個屬性的值。這是正在使用委託像這樣做:C#檢查委託/ func是否有一個有效的接收器

public delegate void ObservingHandler (object value); 

Dictionary<ObservingHandler, ObservationInfo> _handlers = new Dictionary<ObservationHandler, ObservationInfo>(); 

public void register(ObservingHandler handler) { 

    // Observation info is created here and is just a struct 
    _handlers.Add(handler, info); 
} 

這個偉大的工程,是真正有用的,但目前在已註冊的對象被釋放它告訴相關的類,它不再想收到通知。否則,我會得到NULL引用異常。

目前這意味着我不能使用lambda表達式,因爲觀察處理程序是字典中的鍵(因此在刪除它時需要是相同的實例)。

我想要做的是檢查每個ObservationHandler在它被調用之前是否有一個有效的實例化類。這樣一來,責任就從聽課中消失了。

有沒有辦法在Funcdelegate檢查接收器的功能是否還活着?

編輯:

完整的源代碼來自我的項目叫SFCore on GitHub

+2

「否則我得到excetpions」 - 什麼例外?這不太清楚你的意思 - 請展示一個證明問題的[mcve]。 –

+0

'ObservingHandler'是對觀測類中方法的引用。如果observing類被釋放,那麼'ObservingHandler'包含一個對null類中方法的引用。我相信這個異常是一個空引用異常。所以現在我必須讓觀測類在發佈前取消註冊,但是我希望能夠判斷ObservingHandler是否有一個實例化的觀察者。 –

+0

而不是「相信」異常是一個NullReferenceException,爲什麼不向我們展示一個例子?我期望ObservingHandler引用可以自動保持目標活動 - 這裏沒有「發佈」。基本上,直到你能夠以簡明的形式重現問題,要幫助你將會非常困難。 –

回答

1

我會使用.NET事件模型,讓責任留在監聽器中,畢竟如果您的測試因任何原因失敗,您的接收器將不會再被通知。

我會做的,是在通知聽衆的同時,捕捉可能出現的任何異常。

如果發生異常是由於類不再存在(不能更具體地說明您沒有給我們確切的異常名稱),那麼您將忽略它(認爲它只是一次性的錯誤)或從字典中刪除它。

這就是我所要做的,肯定有其他方法來實現這一點。

+0

謝謝,這是一個好主意。有沒有什麼方法可以在通知聽衆之前告訴聽衆是否真的存在?我假設'事件'這樣做,但我不知道如何。 –

0

Observer pattern in C#是通過事件實現的。 根據您的描述建議使用event關鍵字。

您不需要像在示例中那樣持續跟蹤持有字典級別的回調。你在電話中所做的一切就是:開展活動。

+0

但是你仍然需要檢查什麼時候觸發了你有觀察者的事件,如果你不這樣做,你會有一些不錯的'NullReferenceException' – Sidewinder94

+1

如果你總是至少有一個偵聽器,那麼你不需要檢查:事件EventHandler MyEvent =(s,e )=> {}; –

+0

那麼我採取了在這些情況下檢查null的習慣:) 但是,這是另一種方式來看它 – Sidewinder94