我如何退订从事件的所有处理在C#中的特定类? [英] How do I unsubscribe all handlers from an event for a particular class in C#?

查看:147
本文介绍了我如何退订从事件的所有处理在C#中的特定类?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基本前提:



我有当阿凡达进入房间内的所有化身它出版事件的客房。当一个头像离开房间我希望它删除所有预订的房间。



我怎样才能最好的从房间中的所有事件退订阿凡达之前,我添加头像?到一个新的房间,并订阅新房间的事件



中的代码是这样的:

 教室
{
公共事件的EventHandler< EnterRoomEventArgs> AvatarEntersRoom;
公共事件EvnetHandler< LeaveRoomEventArgs> AvatarLeavesRoom;
公共事件的EventHandler< AnotherOfManyEventArgs> AnotherOfManayAvatarEvents;


公共无效AddPlayer(阿凡达theAvatar)
{
Av​​atarEntersRoom(这一点,新Ent​​erRoomEventArgs());

Av​​atarEntersRoom + =新的EventHandler< EnterRoomEventArgs>(theAvatar.HandleAvatarEntersRoom);

Av​​atarLeavesRoom + =新的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆