Вы, кажется, понимаете события с ног на голову. И событие запускается, когда что-то происходит, вы не запускаете событие, чтобы это произошло; Вы вызываете метод.
В вашем случае, когда свойство Team
изменяется, вы запускаете событие. Вы не запускаете событие, чтобы заставить команду измениться. Вам нужно сменить команду? Реализуйте общедоступный метод или метод установки свойств, который делает именно это, и пусть тот, кто хочет сменить команду, изменится.
Кроме того, объявите событие как событие, а не делегат. Правильный способ решения вашей проблемы:
public class Player
{
public event Action<int> TeamChanged;
private int team;
public int Team
{
get { return team; }
set
{
if (value != team) {
team = value;
OnTeamChanged(team); }
}
}
public Player(int startingTeam)
{
team = startingTeam;
}
private void OnTeamChanged(int newTeam)
{
TeamChanged?.Invoke(team);
}
}
И теперь любой потребитель, которому нужно действовать в соответствии с командой смены игрока, подписался бы на это событие.
Вы также можете пропустить весь бизнес OnTeamChanged
и вызвать событие непосредственно в установщике свойств, если только вы не думаете о какой-либо модели наследования, и в этом случае метод должен быть protected
.
Короче говоря, подписка на собственное событие вообще не имеет смысла. Проект, управляемый событиями, полезен именно потому, что вы не можете контролировать или знать , когда событие сработает; пользователь нажимает кнопку мыши или закрывает приложение. С событием, объявленным в самом классе, вы всегда знаете, когда оно будет вызвано, вам пришлось где-то реализовать вызов, подписка на него бессмысленна.