Inledning
Extension methods, eller tilläggsmetoder som vi har valt att kalla dem på svenska, är en teknik som dök upp i C# 3.0. Tilläggsmetoder låter dig skapa nya metoder till befintliga klasser utan att blanda in arv eller på något vis ändra original-klassen. Du kan alltså utöka klasser med nya metoder.
Vi börjar med ett exempel där vi skriver en metod Reverse som vänder tecknen i en sträng.
Exempel 1
using System;
using System.Collections.Generic;
using System.Text;
namespace ExtensionMethods
{
class Program
{
static void Main(string[] args)
{
string test = "123456789";
Console.WriteLine(test.Reverse());
}
}
public static class Utility
{
public static string Reverse(this string input)
{
char[] chars = input.ToCharArray();
Array.Reverse(chars);
return new String(chars);
}
}
}
Förklaring
Tilläggsmetoder är en speciell typ av statiska metoder. De anropas precis som om de var instans-metoder. I exemplet ovan har vi deklarerat en statisk klass Utility i samma fil som vårt testprogram. Vi hade kunnat skriva tilläggsmetoden i en annan fil givetvis eller t.o.m. i ett annat projekt (separat dll-fil). Det viktiga är att inkludera den namnrymd (namespace) som innehåller våra tilläggsmetoder. I exemplet ovan behövde vi inte det eftersom programmet och klassen Utility båda tillhörde samma namnrymd.
Klassen som innehåller våra tilläggsmetoder måste deklareras statisk (static). Likaså själva tilläggsmetoden måste också deklareras statisk. Den första inparametern till metoden deklareras med this typ, i vårt exempel this string, för att tilläggsmetoden skall läggas till typen string. Vill man ha fler parametrar så lägger man dem efter den första this-parametern. Vi tittar på detta i exempel 2 där vi klipper en sträng till en given längd.
Exempel 2
using System;
using System.Collections.Generic;
using System.Text;
namespace ExtensionMethods
{
class Program
{
static void Main(string[] args)
{
string test = "123456789";
Console.WriteLine(test.Truncate(5));
}
}
public static class Utility
{
public static string Truncate(this string input, int length)
{
if (input.Length < length)
return input;
return input.Substring(0, length);
}
}
}
Använder du tilläggsmetoder?
Nu kanske du inte använt LINQ så mycket men det är en vanlig namnrymd sedan C# 3.0 (System.Linq). Det är ett helt bibliotek med tilläggsmetoder främst för hantering av listor, t.ex. sortering, urval, etc. Har du använt LINQ innan så har du garanterat redan använt tilläggsmetoder.
Med tilläggsmetoder så blir det enklare att skriva Utility/Toolbox-klasser som kan återanvändas. Kanske inte så mycket enklare men koden blir snyggare!. Du kan samla på dig bra metoder för vanliga typer som du sedan har nytta av i alla projekt.
Ett sätt att se att du använder en extension method är via intellisense. Metoden får en liten speciell markering (se bild nedan)
Att tänka på
Använd inte tilläggsmetoder om du själv ansvarar för koden och gör det för att undvika att uppgradera en assembly (dll). Tänk också på att om ett metodnamn redan finns i typen så kan du ej "byta ut" metoden genom att skriva en tilläggsmetod med samma namn.
Ett sista exempel
Man kan klura till det lite med tilläggsmetoder. Vad sägs om att göra en uppräknande loop med foreach istället?
using System;
using System.Collections.Generic;
using System.Text;
namespace ExtensionMethods
{
class Program
{
static void Main(string[] args)
{
foreach (int x in 0.To(16))
{
Console.WriteLine(Math.Pow(2, x).ToString());
}
}
}
public static class Utility
{
public static IEnumerable<int> To(this int fromNumber, int toNumber)
{
while (fromNumber < toNumber)
{
yield return fromNumber;
fromNumber++;
}
}
}
}