Как добавить событие в класс - PullRequest
37 голосов
/ 17 сентября 2008

Скажем, у меня есть класс с именем Frog, он выглядит так:

public class Frog
{
     public int Location { get; set; }
     public int JumpCount { get; set; }


     public void OnJump()
     {
         JumpCount++;
     }

}

Мне нужна помощь с 2 вещами:

  1. Я хочу создать событие с именем Jump в определении класса.
  2. Я хочу создать экземпляр класса Frog, а затем создать другой метод, который будет вызываться при прыжке Frog.

Ответы [ 3 ]

56 голосов
/ 17 сентября 2008
public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

тогда

Frog frog = new Frog();
frog.Jump += new EventHandler(yourMethod);

private void yourMethod(object s, EventArgs e)
{
     Console.WriteLine("Frog has Jumped!");
}
1 голос
/ 17 января 2019

Вот пример того, как использовать обычный EventHandler или пользовательский делегат. Обратите внимание, что ?. используется вместо ., чтобы гарантировать, что если событие имеет значение null, оно завершится с ошибкой (вернет null)

public delegate void MyAwesomeEventHandler(int rawr);
public event MyAwesomeEventHandler AwesomeJump;

public event EventHandler Jump;

public void OnJump()
{
    AwesomeJump?.Invoke(42);
    Jump?.Invoke(this, EventArgs.Empty);
}

Обратите внимание, что само событие является нулевым, если нет подписчиков, и что после вызова событие является поточно-ориентированным. Таким образом, вы также можете назначить пустой обработчик по умолчанию, чтобы событие не было пустым. Обратите внимание, что это технически уязвимо для кого-то, кто уничтожает все события (используя GetInvocationList), поэтому используйте его с осторожностью.

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
1 голос
/ 17 сентября 2008

@ CQ: Почему вы создаете локальную копию pf Jump? Кроме того, вы можете сохранить последующий тест, слегка изменив объявление события:

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...