Cada vez que comienzo en lo profundo de un proyecto de C#, termino con muchos eventos que realmente solo necesitan pasar un solo elemento. Me quedo con la práctica EventHandler
/EventArgs
, pero lo que me gusta hacer es tener algo como:.NET EventHandlers - ¿Genérico o no?
public delegate void EventHandler<T>(object src, EventArgs<T> args);
public class EventArgs<T>: EventArgs {
private T item;
public EventArgs(T item) {
this.item = item;
}
public T Item {
get { return item; }
}
}
Más tarde, puedo tener mi
public event EventHandler<Foo> FooChanged;
public event EventHandler<Bar> BarChanged;
Sin embargo, parece que el estándar para .NET es crear un nuevo delegado y una subclase EventArgs
para cada tipo de evento. ¿Hay algún problema con mi enfoque genérico?
EDITAR: El motivo de esta publicación es que acabo de volver a crear esto en un nuevo proyecto, y quería asegurarme de que estaba bien. En realidad, estaba volviendo a crearlo cuando publiqué. Descubrí que hay un genérico
EventHandler<TEventArgs>
, por lo que no necesita crear el delegado genérico, pero aún necesita la clase genérica
EventArgs<T>
, porque
TEventArgs: EventArgs
.
Otra EDIT: Una desventaja (para mí) de la solución integrada es el nivel de detalle adicional:
public event EventHandler<EventArgs<Foo>> FooChanged;
vs
public event EventHandler<Foo> FooChanged;
Puede ser un dolor para los clientes registrarse para su sin embargo, debido a que el espacio de nombres del sistema se importa de manera predeterminada, por lo que deben buscar su espacio de nombre manualmente, incluso con una herramienta de lujo como Resharper ... ¿Alguien tiene alguna idea relacionada con eso?
Para el estilo CRUD que mencionaste en el otro comentario, tendría EntityEventHandler que sería suficientemente autodescriptivo. –
se podría agregar: usando FooArgs = Namespace.EventArgs; que limpiaría el evento hasta - evento público EventHandler FooChanged; –
Fraser