如何取消订阅 C# 中特定类的事件的所有处理程序? [英] How do I unsubscribe all handlers from an event for a particular class in C#?
问题描述
基本前提:
我有一个房间,当一个头像进入"房间内的所有头像时,它会发布一个事件.当头像离开房间时,我希望它删除该房间的所有订阅.
I have a Room which publishes an event when an Avatar "enters" to all Avatars within the Room. When an Avatar leaves the Room I want it to remove all subscriptions for that room.
在将 Avatar 添加到新 Room 并订阅新 Room 的事件之前,如何最好地从 Room 中的所有事件取消订阅 Avatar?
How can I best unsubscribe the Avatar from all events in the room before I add the Avatar to a new Room and subscribe to the new Room's events?
代码如下:
class Room
{
public event EventHandler<EnterRoomEventArgs> AvatarEntersRoom;
public event EvnetHandler<LeaveRoomEventArgs> AvatarLeavesRoom;
public event EventHandler<AnotherOfManyEventArgs> AnotherOfManayAvatarEvents;
public void AddPlayer(Avatar theAvatar)
{
AvatarEntersRoom(this, new EnterRoomEventArgs());
AvatarEntersRoom += new EventHandler<EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);
AvatarLeavesRoom += new EventHandler<EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);
AnotherOfManayAvatarEvents += new EventHandler<EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);
}
}
class Avatar
{
public void HandleAvatarEntersRoom(object sender, EnterRoomEventArgs e)
{
Log.Write("avatar has entered the room");
}
public void HandleAvatarLeaveRoom(object sender, LeaveRoomEventArgs e)
{
Log.Write("avatar has left room");
}
public void HandleAnotherOfManayAvatarEvents(object sender, AnotherOfManyEventArgs e)
{
Log.Write("another avatar event has occurred");
}
}
推荐答案
每个委托都有一个名为 GetInvocationList()
的方法,该方法返回所有已注册的实际委托.所以,假设委托类型(或事件)被命名为 MyDelegate
,并且处理程序实例变量被命名为 myDlgHandler
,你可以这样写:
Each delegate has a method named GetInvocationList()
that returns all the actual delegates that have been registered. So, assuming the delegate Type (or event) is named say MyDelegate
, and the handler instance variable is named myDlgHandler
, you can write:
Delegate[] clientList = myDlgHandler.GetInvocationList();
foreach (var d in clientList)
myDlgHandler -= (d as MyDelegate);
覆盖它可能为空的情况,
to cover the case where it might be null,
if(myDlgHandler != null)
foreach (var d in myDlgHandler.GetInvocationList())
myDlgHandler -= (d as MyDelegate);
这篇关于如何取消订阅 C# 中特定类的事件的所有处理程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!