2014-02-09 36 views
1

我想复制现有的.NET XNA类的事件提供的功能:NetworkSession.GamerJoined如何在分配新处理程序时引发事件?

当事件被分配给它可以立即得到提升,例如:

myNetworkSession.GamerJoined += GamerJoinedEventHandler; 

void GamerJoinedEventHandler(object sender, GamerJoinedEventArgs e) 
{ 
    // If you put a beakpoint on the assignment line above and another here 
    // this handler is called during the assignment. 
} 

我怎样才能做到这一点,如果我写我自己的NetworkSession类的GamerJoined事件?

+0

如果您在事件处理程序方法中使用了副作用,那么只需直接调用它,则不需要XNA来为您执行此操作。很可能你必须重构它并将一些代码移入私有方法,因为构建有效的GamerJoinedEventArgs实例应该很困难。 –

+0

@HansPassant我正在编写这个类的实现,所以为XNA编写的用户代码只能使用我的一个。 – markmnl

+0

然后它是一种代码味道。 *某些*客户端代码有兴趣知道玩家何时加入网络,您不知道代码是什么样子,*不*表示游戏玩家实际加入。 –

回答

2

是的,您可以使用add上下文关键字执行此操作。

当你有行:

public event EventHandler<GamerJoinedEventArgs> GamerJoined; 

这是语法糖:

public event EventHandler<GamerJoinedEventArgs> GamerJoined 
{ 
    add 
    { 
     this.gamerJoined += (EventHandler<GamerJoinedEventArgs>)Delegate.Combine(this.gamerJoined, value); 
    } 
    remove 
    { 
     this.gamerJoined -= (EventHandler<GamerJoinedEventArgs>)Delegate.Remove(this.gamerJoined, value); 
    } 
} 

哪里gamerJoined是该事件的私人支持字段。所以你可以写你自己add来呼叫处理程序,例如

public event EventHandler<GamerJoinedEventArgs> GamerJoined 
{ 
    add 
    { 
     this.gamerJoined += (EventHandler<GamerJoinedEventArgs>)Delegate.Combine(this.gamerJoined, value); 
     value(this, new GamerJoinedEventArgs(myGamer)); 
    } 
    remove 
    { 
     this.gamerJoined -= (EventHandler<GamerJoinedEventArgs>)Delegate.Remove(this.gamerJoined, value); 
    } 
} 
+0

非常好。我从来没有用过它 –

相关问题