Frage

Ich bereite mich darauf vor, eine generische EventArgs-Klasse für Eventargs zu erstellen, die ein einzelnes 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; }
    }
}

Bevor ich das mache, hat C # die gleiche Funktion in die Sprache eingebaut?Ich erinnere mich, dass ich so etwas gefunden habe, 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 deine Hilfe.

War es hilfreich?

Lösung

nein.Sie dachten wahrscheinlich an EventHandler<T> , das Ihnen erlaubtdas Delegierte für jede bestimmte Art von Eventargs definieren.

Ich persönlich fühle mich nicht, dass EventArgs<T> ziemlich so gut ist, obwohl ein Fit ist.Die Informationen, die als "Payload" in der Ereignis-Argumentation verwendet werden, sollten meiner Meinung nach einer benutzerdefinierten Klasse sein, um die Verwendung und die erwarteten Eigenschaften sehr klar zu machen.Die Verwendung einer generischen Klasse verhindern, dass Sie daran hindern, sinnvolle Namen in Position setzen zu können.(Was repräsentieren "Daten"?)

Andere Tipps

Ich muss sagen, ich verstehe hier nicht alle "Puristen". d. H. Wenn Sie bereits eine Taschenklasse definiert haben, die alle Besonderheiten, Eigenschaften usw. - warum der Hack einen zusätzlichen unnötigen Unterricht erstellt, um dem Ereignis- / Args-Mechanismus, Signaturstil, folgen zu können? Ding ist - nicht alles, was in .NET ist - oder ist für diese Angelegenheit 'fehlt - ist "gut" - Ms ist schon seit Jahren " Ich würde sagen, einfach gehen und einen schaffen - wie ich es getan habe - weil ich es genauso brauchte - und habe mich viel Zeit gespart,

Es existiert.Zumindest tut es jetzt.

Sie finden DataEventArgs<TData> in verschiedenen Microsoft-Baugruppen/ Namespaces, zum Beispiel Microsoft.Practices.prism.events .Hierbei handelt es sich jedoch um Namespaces, die Sie möglicherweise nicht als in Ihrem Projekt aufnehmen, damit Sie Ihre eigene Implementierung einfach verwenden können.

Falls Sie sich dafür entscheiden, nicht zu verwenden Prisma , möchte aber immer noch versuchenGenerische Eventargs Annäherung.

generasacodicetagpre.

// Verwenden Sie den folgenden Beispielcode, um zu deklarieren objadded Event

generasacodicetagpre.

// Verwenden Sie den folgenden Beispielcode, um objadded Event

anzuheben generasacodicetagpre.

// und finnaly Sie können Ihr objadded devadded ereignis abonnieren

generasacodicetagpre.

ES GIBT KEINE EINGEBAUTEN GENERISCHEN ARGUMENTE.Wenn Sie dem Microsoft EventHandler-Muster folgen, implementieren Sie Ihre abgeleiteten EventArgs wie von Ihnen vorgeschlagen:public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } }.

Wenn Ihr Team-Styleguide jedoch eine Vereinfachung akzeptiert, kann Ihr Projekt ein leichtes Ereignis wie dieses verwenden:

public event Action<object, string> MyStringChanged;

Nutzung :

// How to rise
private void OnMyStringChanged(string e)
{
    Action<object, string> handler = MyStringChanged;    // thread safeness
    if (handler != null)
    {
        handler(this, e);
    }
}

// How to handle
myObject.MyStringChanged += (sender, e) => Console.WriteLine(e);

Normalerweise verwenden PoC-Projekte den letzteren Ansatz.Beachten Sie jedoch bei professionellen Anwendungen die FX Cop-Begründung # CA1009: https://msdn.microsoft.com/en-us/library/ms182133.aspx

Das Problem mit einem generischen Typ ist, dass, auch wenn derIividtype von Baseterype, Eventargs (Derivedtype) erbt, nicht von Eventargs (Basetype) erben würde.Die Verwendung von Eventargs (Basetype) würde somit später mit einer abgeleiteten Version des Typs verhindern.

Der Grund, warum das nicht existiert, ist, denn das, was das Ende des Endes landen würdeARG, aber auf halbem Weg durch die Umsetzung, dass Sie erkennen, dass es keinen Grund gibt, warum Sie diese Klasse nicht nur von Eventargs erben lassen und es gut anrufen.

Es sei denn, Sie möchten nur eine Zeichenfolge oder etwas Ähnliches für Ihren Datenbeutel, in diesem Fall, in dem wahrscheinlich Eventargs-Klassen Standard in .NET sind, die für jeden einfachen Zweck dienen sollen, in dem Sie sich befinden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top