Question

Je suis prêt à créer un générique EventArgs classe pour l'événement args qu'un seul argument:

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

Avant je fais ça, est-ce que C# ont la même fonctionnalité intégrée dans la langue?Je me souviens de venir à travers quelque chose comme ça quand C# 2.0 est sorti, mais maintenant je ne le trouve pas.

Ou pour le dire d'une autre façon, dois-je créer mon propre générique EventArgs classe, ou est-ce que C# en fournir une?Merci pour votre aide.

Était-ce utile?

La solution

non.Vous pensions probablement à EventHandler<T> , qui vous permetdéfinir le délégué pour tout type spécifique d'éventuels.

Personnellement, je ne pense pas que EventArgs<T> est tout aussi bon qu'un ajustement, cependant.Les informations utilisées comme une "charge utile" dans l'événement argument devraient être, à mon avis, une classe personnalisée pour que l'utilisation et les propriétés attendues soient très claires.L'utilisation d'une classe générique vous empêchera de mettre en place des noms significatifs.(Que représente les "données"?)

Autres conseils

Je dois dire que je ne comprends pas tous les "puristes" ici. I.e. Si vous avez déjà une classe de sac définie - qui possède toutes les spécificités, les propriétés, etc. - pourquoi le piratage crée une classe supplémentaire inutile pour pouvoir suivre le mécanisme d'événement / arguments, style de signature? chose est - pas tout ce qui est dans .net - ou est "absent" de "pour cette affaire - est" bon "- ms's's" corrige "elle-même depuis des années ... Je dirais juste aller en créer une - comme je l'ai fait - parce que j'en avais besoin comme ça - et m'a sauvé beaucoup de temps,

Il n'existe pas.Au moins, il ne l'est aujourd'hui.

Vous pouvez trouver DataEventArgs<TData> dans certains Microsoft différents assemblages/espaces de noms, par exemple Microsoft.Les pratiques.Prism.Les événements.Cependant, ce sont les espaces de noms que vous ne pourriez pas trouver naturel d'inclure dans votre projet afin que vous pouvez simplement utiliser votre propre mise en œuvre.

Si vous choisissez de ne pas utiliser prisme , mais je voudrais toujours essayer ungénérique evenargs approche.

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

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

// Utilisez le code d'exemple suivant pour déclarer Objadded événement

public event EventHandler<GenericEventArgs<TargetObjType>> ObjAdded;

// Utilisez le code d'échantillon suivant pour élever Objadded Event

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

// et Finnaly, vous pouvez vous abonner à votre OBJADDED

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

IL N'EST PAS INTÉGRÉ DANS LE GÉNÉRIQUE ARGS.Si vous suivez Microsoft Gestionnaire de modèle, puis de mettre en œuvre votre dérivés EventArgs comme vous l'avez suggéré:public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } }.

CEPENDANT - si votre équipe de guide de style accepte la simplification, votre projet peut utiliser un léger événements, comme ceci:

public event Action<object, string> MyStringChanged;

utilisation :

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

Habituellement, un PoC projets d'utilisation de la seconde approche.En professionnel de la applicatons, cependant, être conscient de FX cop justification #CA1009: https://msdn.microsoft.com/en-us/library/ms182133.aspx

Le problème avec un type générique est que, même si DeriveType hérite de BaseType, Eventargs (DeriveType) n'hériterait pas d'éventuels (BaseType).Utiliser Eventargs (BaseType) empêcherait ainsi la version ultérieure en utilisant une version dérivée du type.

La raison pour laquelle cela n'existe pas est parce que ce qui finirait par se produire est de mettre en œuvre cela, puis lorsque vous allez remplir le t, vous devez créer une classe avec des propriétés sans ambiguïssement fortement typées qui sert de sac de données pour votre événement.ARG, mais à mi-chemin de la mise en œuvre que vous réalisez que vous ne réalisez aucune raison pour ne pas simplement faire hériter de cette classe d'éventuels et l'appelez bien.

Sauf si vous voulez juste une chaîne ou quelque chose de même basique pour votre sac de données, auquel cas il y a probablement des classes evenargs standard dans .NET qui sont censés servir n'importe quel but simple que vous obtenez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top