我如何退订从事件的所有处理在C#中的特定类? [英] How do I unsubscribe all handlers from an event for a particular class in C#?
问题描述
基本前提:
我有当阿凡达进入房间内的所有化身它出版事件的客房。当一个头像离开房间我希望它删除所有预订的房间。
我怎样才能最好的从房间中的所有事件退订阿凡达之前,我添加头像?到一个新的房间,并订阅新房间的事件
中的代码是这样的:
教室
{
公共事件的EventHandler< EnterRoomEventArgs> AvatarEntersRoom;
公共事件EvnetHandler< LeaveRoomEventArgs> AvatarLeavesRoom;
公共事件的EventHandler< AnotherOfManyEventArgs> AnotherOfManayAvatarEvents;
公共无效AddPlayer(阿凡达theAvatar)
{
AvatarEntersRoom(这一点,新EnterRoomEventArgs());
AvatarEntersRoom + =新的EventHandler< EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);
AvatarLeavesRoom + =新的EventHandler< EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);
AnotherOfManayAvatarEvents + =新的EventHandler< EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);
}
}
级阿凡达
{
公共无效HandleAvatarEntersRoom(对象发件人,EnterRoomEventArgs E)
{
Log.Write(阿凡达已经进入了房间);
}
公共无效HandleAvatarLeaveRoom(对象发件人,LeaveRoomEventArgs E)
{
Log.Write(阿凡达已经离开房间);
}
公共无效HandleAnotherOfManayAvatarEvents(对象发件人,AnotherOfManyEventArgs E)
{
Log.Write(发生其他事件分身);
}
}
每个委托有返回所有已登记的实际代表 GetInvocationList()
命名的方法。因此,假设委托类型(或事件)被命名为说 MyDelegate
,以及处理程序实例变量名为 myDlgHandler
,你可以这样写:
委派[] = clientList myDlgHandler.GetInvocationList();
的foreach(在clientList变种D)
myDlgHandler - =(D为MyDelegate);
要涵盖它可能是空的情况下,
如果(myDlgHandler!= NULL)
的foreach
myDlgHandler(以myDlgHandler.GetInvocationList()VAR D) - =(D为MyDelegate);
或使用新的C#6.0空条件运算符语法...
的foreach(?在myDlgHandler VARð.GetInvocationList())
myDlgHandler - =(D为MyDelegate);
Basic premise:
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.
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?
The code goes something like this:
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");
}
}
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);
or using new C# 6.0 null-conditional operator syntax...
foreach (var d in myDlgHandler?.GetInvocationList())
myDlgHandler -= (d as MyDelegate);
这篇关于我如何退订从事件的所有处理在C#中的特定类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!