基本前提:
我有一个房间,当一个阿凡达"进入"房间内的所有头像时,它会发布一个事件.当阿凡达离开房间时,我希望它删除该房间的所有订阅.
在将"阿凡达"添加到新房间并订阅新房间的活动之前,我怎样才能最好地取消订阅房间中所有活动的阿凡达?
代码如下:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
Cha*_*ana 51
每个委托都有一个名为的方法GetInvocationList(),它返回已注册的所有实际委托.因此,假设委托类型(或事件)名为say MyDelegate,并且处理程序实例变量已命名myDlgHandler,您可以编写:
Delegate[] clientList = myDlgHandler.GetInvocationList();
foreach (var d in clientList)
myDlgHandler -= (d as MyDelegate);
Run Code Online (Sandbox Code Playgroud)
覆盖它可能为null的情况,
if(myDlgHandler != null)
foreach (var d in myDlgHandler.GetInvocationList())
myDlgHandler -= (d as MyDelegate);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32342 次 |
| 最近记录: |