Bom dia, Eu estou com duvida de como devo enviar os parâmetros de um evento. Digamos que eu tenha um EventHandler (ou seja, os parâmetros são object sender e EventArgs e) e eu queira obter conteúdos que vem da classe que notificou o evento, a duvida é: eu faço casting do sender para obter a classe, ou eu crio uma nova classe que herda de EventArgs para eu acessar no segundo parâmetro ?
A situação é essa: 1- Toda vez que um jogador morrer, ele disparará OnPlayerDeath. 2- A classe Achievements deve ser notificada pela primeira morte do jogador, pelo método FirstDeath.
Dúvida: 1- Qual seria a melhor forma, seguindo nomenclatura para fazer tal? esse código está valido? 2- Se eu for pegar o objeto, eu faço apenas casting do sender ou envio pelo Args (que eu teria de criar uma classe que herda de EventArgs) ?
Player player = sender as Player;
3- Eu sou obrigado, pela nomenclatura, de ter um EventHandler como delegate de um evento?
Código:
using System;
public class Program
{
public static void Main()
{
Player jogador = new Player("IntelGraphics");
jogador.PlayerDeath += new Achievements().FirstDeath;
Console.ReadKey();
}
}
public class Player
{
public event EventHandler PlayerDeath;
public string name { get; }
public Player (string name)
{
this.name = name;
}
protected virtual void OnPlayerDeath()
{
if (PlayerDeath != null)
PlayerDeath(this, EventArgs.Empty);
}
public void kill ()
{
OnPlayerDeath();
}
}
public class Achievements
{
public event EventHandler<Player> PlayerAcquiredAchievement;
protected virtual void OnPlayerAcquiredAchievement(Player player)
{
if (PlayerAcquiredAchievement != null)
PlayerAcquiredAchievement(this, player);
}
public void FirstDeath(object sender, EventArgs e)
{
Player player = sender as Player; //<----------------------------------------------------
Console.WriteLine("Você recebeu uma conquista: primeira morte !");
OnPlayerAcquiredAchievement(player);
}
}
public class AchievementsEventHandler : EventArgs
{
public Player player { get; }
public AchievementsEventHandler (Player player)
{
this.player = player;
}
}