c# generics eventargs

c# - ¿.NET tiene un EventArgs<T> incorporado?



generics (7)

Me estoy preparando para crear una clase genérica EventArgs para eventos args que llevan un único argumento:

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

Antes de hacerlo, ¿C # tiene la misma característica incorporada en el lenguaje? Me parece recordar haber encontrado algo así cuando salió C # 2.0, pero ahora no puedo encontrarlo.

O para decirlo de otra manera, ¿tengo que crear mi propia clase genérica EventArgs, o C # proporciona una? Gracias por tu ayuda.


Debo decir que no entiendo a todos los "puristas" aquí. es decir, si ya tiene una clase de bolsa definida, que tiene todas las características, propiedades, etc., ¿por qué el truco crea una clase adicional innecesaria solo para poder seguir el mecanismo de evento / args, estilo de firma? Lo que pasa es que no todo lo que hay en .NET, o que "falta" para el caso, es "bueno". La EM se ha estado "corrigiendo" durante años ... Diría que solo crea uno, como yo lo hice. porque lo necesitaba así, y me ahorró mucho tiempo,


El problema con un tipo genérico es que incluso si DerivedType hereda de BaseType, EventArgs (DerivedType) no heredaría de EventArgs (BaseType). El uso de EventArgs (BaseType) evitaría más adelante el uso de una versión derivada del tipo.


En caso de que elija no usar Prism , pero aún así le gustaría probar un enfoque genérico de EventArgs .

public class GenericEventArgs<T> : EventArgs { public T EventData { get; private set; } public GenericEventArgs(T EventData) { this.EventData = EventData; } }

// Usa el siguiente código de ejemplo para declarar el evento ObjAdded

public event EventHandler<GenericEventArgs<TargetObjType>> ObjAdded;

// Usa el siguiente código de ejemplo para levantar el evento ObjAdded

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

// Y finalmente puedes suscribirte a tu evento ObjAdded

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


La razón por la que esto no existe es porque lo que terminaría sucediendo es que implemente esto, y luego, cuando vaya a completar la T, debe crear una clase con propiedades inequívocas fuertemente tipadas que actúe como la bolsa de datos para su evento arg, pero A mitad de la implementación, te das cuenta de que no hay ninguna razón por la que no solo hagas que la clase herede de EventArgs y lo llames bueno.

A menos que solo quiera una cadena o algo similarmente básico para su bolsa de datos, en cuyo caso probablemente haya clases de EventArgs en .NET que están destinadas a servir a cualquier propósito simple que esté obteniendo.


NO HAY ARGS GENÉRICOS CONSTRUIDOS. Si sigue el patrón Microsoft EventHandler, entonces implementará EventArgs derivados como sugirió: public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } } public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } } public class MyStringChangedEventArgs : EventArgs { public string OldValue { get; set; } } .

SIN EMBARGO, si su guía de estilo de equipo acepta una simplificación, su proyecto puede usar eventos livianos, como este:

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

Por lo general, los proyectos PoC usan el último enfoque. Sin embargo, en aplicaciones profesionales, tenga en cuenta la justificación FX policial # CA1009: https://msdn.microsoft.com/en-us/library/ms182133.aspx


No. Probablemente estabas pensando en EventHandler<T> , que te permite definir el delegado para cualquier tipo específico de EventArgs.

Personalmente, no creo que EventArgs<T> sea ​​tan bueno de forma. La información utilizada como "carga útil" en el evento args debería ser, en mi opinión, una clase personalizada para que su uso y las propiedades esperadas sean muy claras. El uso de una clase genérica evitará que pueda poner nombres significativos en su lugar. (¿Qué representa "Datos"?)


Sí existe. Al menos, ahora sí.

Puede encontrar DataEventArgs<TData> en algunos ensamblados / espacios de nombres de Microsoft diferentes, por ejemplo DataEventArgs<TData> . Sin embargo, estos son espacios de nombres que quizás no encuentre naturales para incluir en su proyecto, por lo que puede usar su propia implementación.