Anvendelse af Extension Methods
skrevet af Niels Brinch
En hurtig demonstration af hvordan man anvende Extension Methods som blev indført med C# 3.0.
Det går ud på at man kan føje flere funktioner til eksisterende klasser, uden f.eks. at skulle nedarve. Synes du f.eks. der mangler en metode på List<string>, jamen så tilføjer du den da bare. Det er en hel lang diskussion om hvorvidt man bør anvende dette, men den vil jeg ikke tage op her. Jeg vil udelukkende vise hvordan.
Konventionen siger, at du skal tilføje en klasse med samme navn som den klasse du extender og så sætte "Extensions" på. I dette tilfælde tilføjer jeg en klasse der hedder ListExtensions fordi jeg extender List-klassen.
Bemærk at klassen skal være 'static' for at kunne anvendes til dette.
Herefter tilføjer du metoden du ville ønske findes til klassen. Lad den modtage den type klasse som du extender som den første parameter med this foran. Sådan.
public static string Join(this List<string> list, string separator)
I den eksisterende List-klasse er der en Split-metode som f.eks. tager en komma-separeret streng og laver den om til en liste. Men der mangler en Join der nemt kan skabe en kommasepareret streng ud fra indholdet af et array. Det er den metode jeg savner og det er den jeg laver.
public static class ListExtensions
{
public static string Join(this List<string> list, string separator)
{
StringBuilder builder = new StringBuilder();
bool isFirst = true;
foreach (string str in list)
{
if (!isFirst)
{
builder.Append(separator);
}
builder.Append(str);
isFirst = false;
}
return builder.ToString();
}
}
I må meget gerne flame mig for ovenstående opbygning. Det ser ikke særligt elegant ud, synes jeg, men kan ikke lige komme på en mere elegant måde at kode det på.
Heldigvis er den elegang at anvende!
Med det samme er der intellisense som viser den nye metode, direkte på enhver instans af List<string>.
Resultatet er selvfølgelig, at vi kan få a,b,c,d,e ud af en List<string> lige så nemt som vi fik det ind.
Nemt og rart for den pragmatiske programmør.
5 kommentarer |