I forbindelse med en VB9-artikel til Alt om DATA lovede jeg at skrive et par indlæg omkring nogle af de nye features - her er en smule om extension methods (som i realiteten ikke bare er VB9 men også C#3).
Extension methods giver os mulighed for at tilføje nye metoder til eksisterende klasser (det være sig egne klasser eller klasser fra CLR) uden at benytte arv eller rekompilering. Det er en feature som er krævet for at få LINQ til at spille, men den kan som det fremgår at følgende eksempler også benyttes til andet.
Et typisk eksempel på hvor LINQ benytter extension methods kan eksempelvis findes i følgende:

Her erklæres et array af heltal, og bemærk hvilke metoder der dukker op gennem IntelliSense. I VB8 var der ikke nogen Select, SelectMany eller Single-metode! Det er metoder som .NET 3.5 tilføjer til Array-klassen, og det sker gennem Extension Methods (bemærk det nye ikon i IntelliSense samt <Extension> i beskrivelsen). Man har altså udvidet den "gamle" Array klasse med metoder uden at rekompilere. At metoderne så er tilføjet for at få LINQ til at virke er en anden historie. Pointen er, at det er sket som Extension Methods, og at vi kan bruge denne feature selv.
Jeg har eksempelvis altid manglet metoder på DateTime-typen, og haft diverse hjælpeklasser. Men i VB9 kan jeg vælge at udvide DateTime. Se eksempelvis:

Her tilføjes fire nye metoder til DateTime. Det sker ved dels at benytte Extension-attributten (fra System.Runtime.CompilerServices), samt benytte DateTime som det første (og i dette tilfælde eneste) argument. Nu kan DateTime pludselig bruges som:

Bingo - nye metoder på DateTime. Endelig kan jeg med et par ekstra metoder

bruge DateTime til eksempelvis at få en generic List(of DateTime) med dagene i en måned eller eksempelvis 10 dage frem:

Extension methods virker som nævnt ikke bare på CLR typer, men også egne typer. Det giver lidt flere muligheder i forbindelse med en ny version en klasse.
Find koden som attachment hvis du vil prøve selv.
extension.zip (.58 KB)