Extension methods

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

Exempel Reverse

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);
        }
    }
}

bild

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

Exempel Truncate

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);
        }
    }
}

bild

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)

bild

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?

Exempel Loop

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++;
            }
        }
    }
}

bild

Övningar

Övning 1

Skriv en tilläggsmetod, HasValue, till typen string. Den skall returnera true om strängen innehåller något tecken annat än blanksteg

Övning 2

Skriv en tilläggsmetod, WordCount, till typen string. Den skall returnera hur många ord som finns i strängen.

Övning 3

Skriv en tilläggsmetod, ToLineArray, till typen string. Den skall returnera en lista av strängar där varje rad i strängen är ett index i listan.

Övning 4

Skriv en tilläggsmetod, IsEven, till typen int. Den skall returnera true om talet är jämnt.

Övning 5

Skriv en tilläggsmetod, IsNumeric, till typen string. Den skall returnera true om strängen kan göras om till ett heltal.

Övning 6

Denna är lite klurig. Vi vill kunna skriva på följande sätt "string message = "Welcome {0} (Last login: {1})".FormatString(userName, lastLogin);" Det kräver en tilläggsmetod. Skriv den (obs tänk på att formatsträngen kan ta flera parametrar)

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Scroll to top