Frage

Sagen wir, ich habe eine Klasse namens Frog, es sieht aus wie:

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


     public void OnJump()
     {
         JumpCount++;
     }

}

Ich brauche mit 2 Dingen helfen:

  1. Ich möchte eine Veranstaltung namens Jump in der Klassendefinition erstellen.
  2. Ich möchte eine Instanz der Frosch-Klasse erstellen, und dann eine andere Methode erstellen, die aufgerufen wird, wenn der Frosch springt.
War es hilfreich?

Lösung

public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

dann

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

private void yourMethod(object s, EventArgs e)
{
     Console.WriteLine("Frog has Jumped!");
}

Andere Tipps

@CQ: Warum erstellen Sie eine lokale Kopie von Jump? Darüber hinaus können Sie den nachfolgenden Test speichern, indem Sie leicht die Erklärung des Ereignisses zu ändern:

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}

Hier ist ein Beispiel dafür, wie einen normalen Eventhandler zu verwenden oder einen benutzerdefinierten Delegaten. Beachten Sie, dass ?. anstelle von . verwendet, um sicherzustellen, dass, wenn das Ereignis null ist, wird es nicht sauber (return 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);
}

Beachten Sie, dass das Ereignis selbst nur null ist, wenn es keine Abonnenten sind, und dass einmal aufgerufen wird, ist das Ereignis Thread-sicher. So können Sie auch einen Standard leer Handler zuweisen das Ereignis, um sicherzustellen, ist nicht null. Beachten Sie, dass dies jemand technisch verwundbar ist sonst alle Ereignisse auszulöschen (mit GetInvocationList), so mit Vorsicht verwenden.

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top