Если я вас правильно понимаю. Этот класс обертывает неизвестный класс myvm, который я использую SocketAsyncEventArgs для иллюстрации, потому что, очевидно, у нас нет исходного кода для класса SocketAsyncEventArgs.
И я завернул завершенное событие класса SocketAsyncEventArgs. Когда это событие будет запущено, будет запущен _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