假設我有一個類說視圖模式類mvvm。然後爲這個虛擬機創建一些事件處理程序。那麼它可以被許多其他情況使用。如何檢測事件處理程序併發布它?
所以,如果我有一個myvm的實例,我想檢測是否有任何事件處理程序掛鉤,並希望釋放它的內存問題。
什麼是通過myvm完成此操作的通用方式,例如,我可能沒有myvm的源代碼?
假設我有一個類說視圖模式類mvvm。然後爲這個虛擬機創建一些事件處理程序。那麼它可以被許多其他情況使用。如何檢測事件處理程序併發布它?
所以,如果我有一個myvm的實例,我想檢測是否有任何事件處理程序掛鉤,並希望釋放它的內存問題。
什麼是通過myvm完成此操作的通用方式,例如,我可能沒有myvm的源代碼?
事件的設計使得聲明它們的類之外的代碼無法訪問底層代理。例如,根據一節中的C# Language specification(重點煤礦)「10.8事件」:
在以下形式的運算x + = y或x - = Y,當x是一個事件和 基準取在包含聲明x的類型之外的位置,操作結果的類型爲void(因爲 與具有x的類型相反,其中 賦值後x的值)。 此規則禁止從外部代碼中間接地檢查事件的基礎代理 。
因此,找出什麼訂閱了課外活動,充其量只能是「解決辦法」。
如果你能夠訪問包含該事件類的源和你想跟蹤迷上了代表到event,實現在事件定義和manually keep track of them in a Dictionary的add和remove關鍵字。
如果我理解正確。 該類封裝了我使用SocketAsyncEventArgs進行說明的未知myvm類,顯然,我們沒有SocketAsyncEventArgs類的源代碼。
而且我封裝了SocketAsyncEventArgs類的Completed事件。當該事件被觸發時,_instance_Completed將被觸發,然後_myvm事件將被觸發。所以我們需要做的是訂閱/取消訂閱_myvm事件。
然後,我離開一個人們訂閱/取消訂閱_myvm事件的事件,作爲訂閱/取消訂閱,代表被存儲到列表中,因此您可以通過調用ClearEvents()方法來清除 。
希望它會有所幫助。
public class WrapperClass
{
private EventHandler<SocketAsyncEventArgs> _myEvent;
private SocketAsyncEventArgs _myvm;
private List<Delegate> delegates;
public WrapperClass()
{
delegates = new List<Delegate>();
}
public void SetInstance(SocketAsyncEventArgs myvm)
{
_myvm = myvm;
_myvm.Completed += new EventHandler<SocketAsyncEventArgs>(_instance_Completed);
}
private void _instance_Completed(object sender, SocketAsyncEventArgs e)
{
if (_myEvent != null)
{
_myEvent(sender, e);
}
}
public event EventHandler<SocketAsyncEventArgs> myEvent
{
add
{
delegates.Add(value);
_myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Combine(_myEvent, value);
}
remove
{
delegates.Remove(value);
_myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Remove(_myEvent, value);
}
}
public void ClearEvents()
{
foreach (var d in delegates)
{
_myEvent = (EventHandler<SocketAsyncEventArgs>)Delegate.Remove(_myEvent, d);
}
}
}
你想釋放什麼,事件處理程序或myvm? – CrazyCasta