Исходный код работает нормально, если MyDelegate
'ev
', переданный в addEvent
и removeEvent
, является одним и тем же экземпляром объекта (например, если есть поле MyDelegate
уровня класса) который содержит экземпляр или если вы следуете советам нескольких других здесь и сохраняете объект (ы) MyDelegate
в словаре).
Я подозреваю, что проблема в том, что код, вызывающий addEvent
и removeEvent
, передает новые MyDelegate
экземпляры, указывающие на некоторый метод-обработчик, например:
addEvent(new MyDelegate(this.HandlerMethod));
// ... do some stuff
removeEvent(new MyDelegate(this.HandlerMethod));
В этом случае addEvent
и removeEvent
создают EventHandler
делегатов, которые указывают на разные адреса методов, даже если эти делегаты в свою очередь указывают на один и тот же метод (this.HandlerMethod
). Это связано с тем, что EventHandler
делегирует, что add
и remove
создают точку для метода MyDelegate.Invoke()
в разных экземплярах MyDelegate
, а не прямо на адрес this.HandlerMethod
.