Domanda

Mi sto preparando per creare una classe Generico EventArgs per ARGS evento che trasporta un singolo argomento:

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; }
    }
}
.

Prima di farlo, c # ha la stessa funzione integrata nella lingua?Mi sembra di ricordare di incontrare qualcosa del genere quando è uscito C # 2.0, ma ora non riesco a trovarlo.

o per metterlo in un altro modo, devo creare la mia classe Generico EventArGS o C # fornisce uno?Grazie per il tuo aiuto.

È stato utile?

Soluzione

no.Probabilmente stavi pensando a EventHandler<T> , che ti consentePer definire il delegato per qualsiasi tipo specifico di EventArgs.

Personalmente non ritengo che EventArgs<T> sia abbastanza buono per un adattamento, però.Le informazioni utilizzate come "carico utile" nell'evento ARGS dovrebbero essere, a mio avviso, una classe personalizzata per rendere la sua utilizzo e le proprietà previste molto chiare.L'utilizzo di una classe generica ti impedirà di poter mettere in atto nomi significativi.(Cosa rappresenta i "dati"?)

Altri suggerimenti

Devo dire che non capisco tutti i "puristi" qui. I.e. Se hai già una classe di sacchetto definita - che ha tutte le specifiche, le proprietà ecc. - Perché l'hack creerono una classe in più inutile per essere in grado di seguire il meccanismo evento / args, stile firma? La cosa è - non tutto ciò che è in .NET - o è "Manca" per quella materia - è "buono" - la SM è stata "correggendo" per anni ... Direi solo andare e creare uno - come ho fatto io - perché ne avevo bisogno proprio così - e mi ha salvato molto tempo,

esiste.Almeno, ora fa ora.

Puoi trovare DataEventArgs<TData> in alcuni diversi gruppi Microsoft/ namespaces, ad esempio Microsoft.Practices.Prism.events .Tuttavia questi sono i namespace che potresti non trovare naturali da includere nel tuo progetto in modo da poter solo usare la propria implementazione.

Nel caso in cui si scelga di non utilizzare Prism , ma vorrebbe comunque provare aAvvicinamento Endargs .

public class GenericEventArgs<T> : EventArgs
{
    public T EventData { get; private set; }

    public GenericEventArgs(T EventData)
    {
        this.EventData = EventData;
    }
}
.

// Utilizzare il seguente codice di esempio per dichiarare objadded event

public event EventHandler<GenericEventArgs<TargetObjType>> ObjAdded;
.

// Utilizzare il seguente codice di esempio per aumentare objadded event

private void OnObjAdded(TargetObjType TargetObj)
{
    if (ObjAdded!= null)
    {
        ObjAdded.Invoke(this, new GenericEventArgs<TargetObjType>(TargetObj));
    }
}
.

// e finnaly puoi iscriverti a objadded event

SubscriberObj.ObjAdded +=  (object sender, GenericEventArgs<TargetObjType> e) =>
{
    // Here you can explore your e.EventData properties
};
.

Non c'è ARG generico incorporato. Se segui Microsoft EventHandler Pattern, quindi implementa il tuo EventArg derivato come hai suggerito: public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } }.

Tuttavia - Se la guida in stile team accetta una semplificazione: il tuo progetto può utilizzare un evento leggero, come questo:

public event Action<object, string> MyStringChanged;
.

Uso:

// 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);
.

Di solito un progetto POC utilizza quest'ultimo approccio.Nelle applicazioni professionali, tuttavia, essere consapevoli della giustificazione del poliziotto FX # ca1009: https://msdn.microsoft.com/en-us/library/ms182133.as182133.aspx

Il problema con un tipo generico è che anche se DerivedType eredita da Basetype, EventArgs (DerivedType) non sarebbe ereditato da EventArgs (Basetype).L'utilizzo di EventArgs (Basetype) impedirebbe quindi in seguito utilizzando una versione derivata del tipo.

Il motivo per cui ciò non esiste è perché cosa avrebbe finito per accadendo è implementato questo, e poi quando vai a compilare il T, dovresti creare una classe con proprietà inequivocabili fortemente digitate che agisce come la borsa dati per il tuo eventoARG, ma a metà strada per implementazione che ti rendi conto che non c'è motivo per cui non fai semplicemente quella classe eredita da Endargs e chiamalo bene.

A meno che tu non voglia solo una stringa o qualcosa di simile di base per il tuo sacchetto di dati, nel qual caso ci sono probabilmente lezioni di EventArgs standard in .NET che sono destinate a servire qualunque semplice scopo che stai arrivando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top