Как я отказываюсь от подписки все обработчики от события для конкретного класса в C#?

Я просто хотел защелкнуться на любые запросы ajax для всей страницы. @SuperG заставил меня начать. Вот что я закончил с:

// redirect ajax requests that are redirected, not found (404), or forbidden (403.)
$('body').bind('ajaxComplete', function(event,request,settings){
        switch(request.status) {
            case 301: case 404: case 403:                    
                window.location.replace("http://mysite.tld/login");
                break;
        }
});

Я хотел специально проверить определенные коды состояния http, чтобы основать мое решение. Однако вы можете просто привязать ajaxError к чему-то другому, кроме успеха (возможно, только 200)? Я мог бы просто написать:

$('body').bind('ajaxError', function(event,request,settings){
    window.location.replace("http://mysite.tld/login");
}
32
задан Nathan Smith 15 January 2009 в 18:31
поделиться

4 ответа

У каждого делегата есть метод, названный GetInvocationList(), который возвращает всех фактических делегатов, которые были зарегистрированы. Так, принятие Типа делегата (или событие) называют, говорят MyDelegate, и переменную экземпляра обработчика называют myDlgHandler, можно записать:

Delegate[] clientList = myDlgHandler.GetInvocationList();
foreach (var d in clientList)
       myDlgHandler -= (d as MyDelegate);

для покрытия случая, где это могло бы быть пустым,

 if(myDlgHandler != null)
  foreach (var d in myDlgHandler.GetInvocationList())
       myDlgHandler -= (d as MyDelegate);
51
ответ дан 27 November 2019 в 18:13
поделиться

Есть ли, что-то не так со стандартом удаляет?

public void RemovePlayer(Avatar theAvatar) {
 AvatarEntersRoom -= new EventHandler<EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);

}

РЕДАКТИРОВАНИЕ

На основе Вашего обновления кажется, что Вы хотите код, который удалит конкретный объект из всех событий на конкретном классе. Нет никакого реалистического способа выполнить эту цель. Это является часто немного подробным, но лучший способ состоит в том, чтобы индивидуально добавить/удалить конкретную комбинацию метода объекта от каждого события.

единственный способ стать близким к этой функциональности состоит в том, чтобы использовать отражение. Вы могли отражающим образом захватить все события на своем классе и затем сделать некоторое волшебство найти все экземпляры класса в цепочке события. Это только будет частичным решением хотя, потому что оно проигнорирует такие вещи как лямбда-выражение обработчики событий.

4
ответ дан 27 November 2019 в 18:13
поделиться

Вероятно, самый простой способ выполнить это состоял бы в том, чтобы сохранить все Ваши подписанные события для аватара в ArrayList из делегатов в событиях.

, Когда аватар покидает комнату, просто цикл через список делегатов, выполняющих стандарт, удаляет (-=).

4
ответ дан 27 November 2019 в 18:13
поделиться

можно работать на всех подписчиках события с:

_Event.GetInvocationList()

и удаляют каждый обработчик событий.

Delegate[] subscribers = myEvent.GetInvocationList();

for(int i = 0; i < subscribers.Length; i++)    
{    
    myEvent -= subscribers[i] as yourDelegateType;   
}
2
ответ дан 27 November 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: