Jeg lavede for noget tid siden, min egen generiske model af en EventArgs klasse. Siden .NET 2.0, har vi kunne erklære en række generiske delegates af typen: EventHandler<T>, og på den måde er vi sluppet for at skulle udfører det trivielle arbejde det er at erklære disse delegates. Men hvad nu med EventArgs? Hvorfor er der ikke en generisk klasse? Jeg ved ikke hvor tit jeg lige har behov for at sende lidt argumenter med, når jeg rejser en event - det er tit.
[code=csharp]namespace System
{
public class EventArgs
; : EventArgs
{
public EventArgs(T value)
{
this.Value = value;
}
public T Value { get; set; }
}
}
[/code]
På den måde, kan jeg nemt sende data med, når mine objekter rejser events:
[code=csharp]
public event EventHandler> HelloWorldRaised;
// Og rejse den
if (HelloWorldRaised != null)
HelloWorldRaised(this, new EventArgs(i));
[/code]
Det sparer mig for en masse triviel kodning, men jeg undre mig bare hvorfor MS ikke har lavet denne klasse, når de nu har lavet et hav af andre generiske shortcuts. Er den nævnte fremgangsmåde forkert? Bør man i stedet sørge for at klasser der har behov for den slags kommunikation til omverdenen, har status i stedet? Altså udstiller en public property med værdien af interesse.
Umiddelbart, kan jeg se at man så kommer til at bruge energi på at caste sender objektet, hvor den beskrevne metode, er lidt renere efter min mening.
[code=csharp]//Med generisk EventArgs
static void HelloWorldRaisedDelegate(object sender, EventArgs e)
{
DoTheThingWith(e.Value);
}
// Uden
static void HelloWorldRaisedDelegate(object sender, EventArgs e)
{
MyClass raiser = sender as MyClass;
if ( raiser!=null)
DoTheThingWith(raise.Value);
} [/code]
Er der noget jeg overser, hvis jeg nu skal have det fine armbånd på?