12 Stimmen

EventHandler-Typ ohne Ereignis-Args

Wenn wir Daten an einen Ereignisteilnehmer übergeben wollen, verwenden wir dazu EventArgs (oder CustomEventArgs).

.Net bietet einen eingebauten Typ EventHandler, der als Parameter eine Instanz der EventArgs-Klasse verwendet, die ebenfalls eingebaut ist.

Was ist mit Fällen, in denen ich einen Abonnenten benachrichtigen muss, dass eine Aktion abgeschlossen ist, z. B. die Suche beendet ist? Ich möchte nicht einmal EventArgs verwenden, die nichts enthalten werden.

Gibt es einen eingebauten Typ für die Signalisierung einer anderen Klasse, ohne die Notwendigkeit, leere EventArgs zu verwenden?

15voto

Marc Gravell Punkte 970173

Ich würde Ihnen wirklich raten, die Standard-EventHandler-Muster hier zu verwenden und einfach übergeben EventArgs.Empty . Aber Sie peut verwenden. Action als Ereignistyp, wenn Sie es wirklich wollen - es ist einfach ungewöhnlich.

8voto

Random Dev Punkte 50772

Sie haben mehrere Möglichkeiten:

  1. Verwenden Sie ein normales Ereignis mit einer EventHandler und den grundlegenden EventArg Klasse - sicher, das Ereignis ist leer, aber schadet das überhaupt?
  2. Erstellen Sie Ihren eigenen Delegierten und verwenden Sie diesen mit event MyDelegateWithoutParams MyEvent;
  3. Verwenden Sie das Observer-Muster mit IObservable stattdessen.
  4. Lassen Sie Kunden eine Action zu Ihnen und rufen Sie zu dieser Aktion auf.

Ich hoffe, dass eine dieser Optionen Ihren Vorstellungen entspricht. Ich verwende 1 und 4 für diese Art von Situation (4 meistens, wenn es nur einen "Zuhörer" gibt).

PS: Ich schätze, dass 2 nicht mit dem .NET-Framework-Leitlinien also ist das vielleicht nicht die beste Idee ;)

8voto

Davide Piras Punkte 42970

Wenn Sie die einfache delegates sicherlich können Sie tun, was Sie wollen, aber wenn Sie die events Ich denke, es ist am besten, sich an den Standard zu halten und immer eine object Absender und EventArgs e.

wenn Sie wirklich nicht wissen, was Sie beim Auslösen dieser Ereignisse aus Ihrem eigenen Code übergeben sollen, übergeben Sie einfach EventArgs.Empty als zweiten Parameter.

8voto

Eternal21 Punkte 3494

Verwenden Sie Actions (untenstehende Antwort kopiert von https://stackoverflow.com/a/1689341/1288473 ) :

Erklären:

public event Action EventWithoutParams; 
public event Action<int> EventWithIntParam;

Anrufe:

EventWithoutParams?.Invoke(); 
EventWithIntParam?.Invoke(123);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X