Ich bereite mich darauf vor, eine generische EventArgs-Klasse für Ereignisargumente zu erstellen, die ein einziges Argument enthalten:
public class EventArg<T> : EventArgs
{
// Property variable
private readonly T p_EventData;
// Constructor
public EventArg(T data)
{
p_EventData = data;
}
// Property for EventArgs argument
public T Data
{
get { return p_EventData; }
}
}
Hat C # zuvor dieselbe Funktion in die Sprache integriert? Ich erinnere mich an so etwas, als C # 2.0 herauskam, aber jetzt kann ich es nicht finden.
Oder anders ausgedrückt: Muss ich meine eigene generische EventArgs-Klasse erstellen oder stellt C # eine bereit? Danke für Ihre Hilfe.
Eventhandler<T>
EventArgs<T>
CAB / SCSF-basierten Code gesehen. Dies ist in CAB / SCSF-Anwendungen durchaus üblich. Obwohl es nicht Teil des Frameworks ist, gibt es eine EventArgs <T> -Implementierung.Antworten:
Nein. Sie haben wahrscheinlich darüber nachgedacht
EventHandler<T>
, wie Sie den Delegaten für einen bestimmten Typ von EventArgs definieren können.Ich persönlich finde das allerdings nicht
EventArgs<T>
ganz so gut. Die Informationen, die als "Nutzlast" in den Ereignisargumenten verwendet werden, sollten meiner Meinung nach eine benutzerdefinierte Klasse sein, um die Verwendung und die erwarteten Eigenschaften sehr deutlich zu machen. Die Verwendung einer generischen Klasse verhindert, dass Sie aussagekräftige Namen einfügen können. (Was bedeutet "Daten"?)quelle
Ich muss sagen, ich verstehe hier nicht alle Puristen. dh wenn Sie bereits eine Taschenklasse definiert haben - die alle Besonderheiten, Eigenschaften usw. enthält - warum erstellt der Hack eine zusätzliche unnötige Klasse, um dem Ereignis- / Argumentmechanismus, dem Signaturstil, folgen zu können? Die Sache ist - nicht alles, was in .NET vorhanden ist - oder was in dieser Angelegenheit "fehlt" - ist "gut" - MS "korrigiert" sich seit Jahren selbst ... Ich würde sagen, gehen Sie einfach und erstellen Sie eine - wie ich - weil ich es einfach so brauchte - und mir viel Zeit gespart habe,
quelle
Es existiert. Zumindest jetzt.
Sie finden sie
DataEventArgs<TData>
in verschiedenen Microsoft-Assemblys / Namespaces, z. B. Microsoft.Practices.Prism.Events . Dies sind jedoch Namespaces, die Sie möglicherweise nicht als natürlich in Ihr Projekt aufnehmen können, sodass Sie möglicherweise nur Ihre eigene Implementierung verwenden.quelle
Falls Sie sich dafür entscheiden, Prism nicht zu verwenden , aber dennoch einen generischen EventArgs- Ansatz ausprobieren möchten .
// Verwenden Sie den folgenden Beispielcode, um das ObjAdded- Ereignis zu deklarieren
// Verwenden Sie den folgenden Beispielcode, um das ObjAdded- Ereignis auszulösen
// Und schließlich können Sie Ihr ObjAdded- Ereignis abonnieren
quelle
ES GIBT KEINE EINGEBAUTEN GENERISCHEN ARGS. Wenn Sie dem Microsoft EventHandler-Muster folgen, implementieren Sie Ihre abgeleiteten EventArgs wie vorgeschlagen :
public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } }
.JEDOCH - wenn Ihr Team-Styleguide eine Vereinfachung akzeptiert - kann Ihr Projekt leichtgewichtige Ereignisse wie das folgende verwenden:
Verwendung :
Normalerweise verwenden PoC-Projekte den letzteren Ansatz. Beachten Sie bei professionellen Anwendungen jedoch die FX Cop-Begründung # CA1009: https://msdn.microsoft.com/en-us/library/ms182133.aspx
quelle
Das Problem mit einem generischen Typ besteht darin, dass EventArgs (DerivedType) selbst dann nicht von EventArgs (BaseType) erben würde, wenn DerivedType von BaseType erbt. Die Verwendung von EventArgs (BaseType) würde daher die spätere Verwendung einer abgeleiteten Version des Typs verhindern.
quelle
IEventArgs
, aber die einzigen Klassen, die in Bezug auf generische Typparameter generisch sein können, sind Delegaten, denen nicht zugeführt wirdDelegate.Combine
. Delegaten, die mit verwendet werden,Delegate.Combine
sollten nicht kovariant sein, da man z. B. einAction<DerivedType>
in einem Feld vom Typ speichern kannAction<BaseType>
, aber ein späterer VersuchCombine
, dies mit einer Instanz von zuAction<BaseType>
tun, schlägt fehl.Der Grund, warum dies nicht existiert, ist, dass Sie dies implementieren würden. Wenn Sie dann das T ausfüllen, sollten Sie eine Klasse mit stark typisierten eindeutigen Eigenschaften erstellen, die als Datentasche für Ihr Ereignisargument fungiert Nach der Hälfte der Implementierung stellen Sie fest, dass es keinen Grund gibt, diese Klasse nicht einfach von EventArgs zu erben und sie als gut zu bezeichnen.
Es sei denn, Sie möchten nur eine Zeichenfolge oder etwas ähnlich Grundlegendes für Ihre Datentasche. In diesem Fall gibt es wahrscheinlich EventArgs-Klassen in .NET, die für jeden einfachen Zweck gedacht sind, den Sie erreichen.
quelle