Вместо того, чтобы ссылаться на любого делегата, вы можете задействовать свой класс, чтобы вернуть список вызовов вызывающему абоненту. В основном вы можете написать что-то вроде этого (предполагая, что MyEvent объявлен внутри MyClass):
public class MyClass
{
public event EventHandler MyEvent;
public IEnumerable GetMyEventHandlers()
{
return from d in MyEvent.GetInvocationList()
select (EventHandler)d;
}
}
Таким образом, вы можете получить доступ ко всему списку вызовов извне MyClass и отменить подписку на любой обработчик, который вы хотите. Например:
myClass.MyEvent -= myClass.GetMyEventHandlers().Last();
Я написал полный пост об этом tecnique здесь .