C# Benutzerdefinierte EventArgs Frage
Habe ich eine benutzerdefinierte Sammlung, dass ich bin das hinzufügen einer ValidateItem Ereignis. Diese ValidateItem Ereignis wird aufgerufen, wenn ein Element Hinzugefügt oder aktualisiert in der benutzerdefinierten collection.
Möchte ich ermöglichen, abgeleitete Klassen, um in der Lage sein, um das Ereignis zu abonnieren und zu bestimmen, Ihre eigene Logik, ob oder nicht ein Einzelteil ist "gültig" und potenziell verbieten es der Auflistung Hinzugefügt wird, wenn es "invalid".
Aber ich versuche herauszufinden, wie der Anrufer zu der Veranstaltung wissen, was Los ist und wie übergeben Sie die Informationen über das, was da zurück.
Meine benutzerdefinierte eventargs Erben von CancelEventArgs also ich habe die Fähigkeit, übergeben Sie die Abbrechen-bit zurück, um dem Anrufer mit, dass. Aber ich habe nie gesehen, alle Fälle, in denen Fehler-information (error codes, Nachrichten, etc) übergeben bekommt sich wieder in dieser Weise, so Frage ich mich, ob das vielleicht nicht der beste Ansatz sein.
Sollte ich einfach fügen Sie jede Fehlermeldung, die ich wünschte, zu passieren, back zu meiner Benutzerdefinierte eventargs-Klasse, gibt es gute Gründe, die für oder gegen diese? oder gibt es andere, bessere Wege, dies zu erreichen?
Hier ist mein eventargs-Klasse:
public delegate void ItemValidationEventHandler(object sender, ItemValidationEventArgs e);
public class ItemValidationEventArgs : CancelEventArgs
{
public ItemValidationEventArgs(object item, ObjectAction state, EventArgs e)
{
Item = item;
State = state;
EventArgs = e;
}
public ItemValidationEventArgs(object item, ObjectAction state) : this(item, state, new EventArgs())
{
}
public ItemValidationEventArgs() : this(null, ObjectAction.None, new EventArgs())
{
}
//is there a better way to pass this info?
public string ErrorMessage {get; set;}
public int ErrorNumber {get;set;}
public object Item { get; private set; }
public ObjectAction State { get; private set; }
public EventArgs EventArgs { get; private set; }
}
UPDATE: ich glaube, eine andere Möglichkeit wäre die Verwendung von so etwas wie dieses:
virtual bool Validate(object item, ObjectAction action, out string errorMessage)
Methode in den abgeleiteten Klassen. Obwohl ich dazu Neige zu bevorzugen, die Vermeidung von out-Parametern...
Wenn jemand irgendwelche Ideen auf die vor-und Nachteile jeder Ansatz, den ich lieben würde, zu hören, em!
Dank,
Max
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mithilfe von Ereignissen, die für dies ist wahrscheinlich nicht die beste design-Ansatz.
Da es einer erbenden Klasse, wäre das überschreiben dieses Verhalten, sollte die Methode als geschützt gekennzeichnet werden und virtuelle:
Ich auch nicht wie mit
out
auf Parameter, so dass nach Ihrem ursprünglichen Instinkte zu verwendenEventArgs
, sollten Sie wahrscheinlich erstellen Sie eine Klasse zu Kapseln, die Ergebnisse Ihrer überprüfung.Beispiel:
Deine Methode wäre dann:
Die vor-und Nachteile der Verwendung dieser über Ereignisse, die Ereignisse, die verwendet werden sollen, wenn Sie wollen, zu veröffentlichen, eine Aktion oder Informationen an mehrere Abonnenten. Die Abonnenten sind Klassen, die Sie wissen nichts über. Sie kümmern sich nicht, wer Sie sind oder was Sie tun. Sie sollten nie wirklich weiterleiten von Informationen zurück an die Benachrichtigung Klasse. Sie sollten nur das Ereignis verarbeitet Informationen, die Ihnen gegeben.
In Ihrem Beispiel, Ihrer geerbten Klasse ist Ihr nur Abonnent. Auf top von, dass Sie wollen in der Lage sein, pass nützliche Informationen zurück zu der übergeordneten Klasse. Vererbung passt dieses erwünschte Verhalten viel besser, und auch ermöglicht es Ihnen, leicht zu implementieren verschiedene Arten der Validierung Klasse. Mit Ereignissen, die Sie hätten halten Sie die Eingabe-code zum anfügen von Ereignishandlern immer und immer wieder (sehr hässlich IMO).
Ich glaube nicht, dass das, was Sie beschreiben, wirklich passt den Betrachter, erkennbare Muster, die Sie normalerweise sehen, mit Veranstaltungen.
Da diese abgeleiteten Klassen würde ich wahrscheinlich schauen, um die Virtualisierung der Validierungs-Methode der Objekte und mit den Kindern einen spezifischen Validierungs-routine.
Gut, wenn Sie erstellen Sie Ihre eigenen benutzerdefinierten Validierung Veranstaltungen, zusammen mit benutzerdefinierten Validierung event args, ich würde davon ausgehen, Sie würden es vorziehen, pass zurück status/error codes anstatt werfen Ausnahmen, wenn etwas nicht bestätigen.
In diesem Fall, wenn Sie wollen, um zu prüfen, ob nicht Ausnahmen werfen, dann ja, ich würde die Felder, die Sie benötigen, um Ihre benutzerdefinierten event-args - Sie sind Gewohnheit bereits, es gibt also keinen Grund, nicht, um Sie zu verlängern, um Ihre Bedürfnisse anzupassen 🙂
Marc
Ein paar schnelle Gedanken:
Ich würde die Eigenschaften readonly entsprechen dem "normalen" Muster der eventargs-Klassen.
Vielleicht die Eigenschaften in Bezug auf Fehler Informationen sollten gewickelt werden zusammen in eine ErrorInformation Klasse (das würde es etwas einfacher machen zu gehen, dass Informationen etwa zu anderen Methoden).
Sich die Frage: was tun, verwenden Sie die EventArgs-Eigenschaft für?
Benutzerdefinierte event-args sind speziell verwendet, um Informationen zu und von den event-Handler, also ja, Sie sind ein guter Ort, um Sie gelegt.
Die andere option wäre eine Ausnahme - dies ist eine ziemlich plumpe, aber sollte aufhören, andere event-Handler wird ausgeführt, für die Veranstaltung.
EventArgs und CancelEventArgs nicht alle Mitglieder tragen Informationen an die Abonnenten.
So, normalerweise würden Sie Erben von einer dieser Klassen, und fügen Sie ein oder mehrere Mitglieder zu tragen info.
Sie können auch Ihre Klasse generisch, so dass Sie nicht haben, um eine neue EventArgs-Klasse, wenn Sie verschiedene Daten zu senden.
Schließlich, anstatt Ihre eigenen ItemValidationEventHandler delegate-Typ, die Sie verwenden können
EventHandler<T>
, wobei T der Typ des EventArgs-parameter.Auch, Sie brauchen nicht die EventArgs = e Mitglied.