2014-02-09 5 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

Очень приятно. Я никогда не использовал его –

Смежные вопросы