Extension metoder i C#

Extension metoder er en måde at udvide de indbyggede (og andre) klasser i .NET frameworket (Fra 3.0) med dine egne funktioner, således at det for eksempel bliver muligt at kalde string.indeholderMartin() eller måske endda noget mere brugbart.

Til det første eksempel bruger vi string.indeholderMartin(), det vil man skrive på følgende måde:

     public static bool indholderMartin(this string expression)

            {

                   if (expression == null)

               {

                    throw new ArgumentNullException("expression");

               }





                        if(expression.Contains("Martin"))

                                                return true;

                        return false;



            }
Denne funktion kan man så kalde på alle strings. Fx med følgende:

string s = ”test af en martin funktion”;

bool test = s.indeholderMartin();

Det der gør det til en extension metode er tilfældet af this som den første parameter til funktionen, anden parameter fortæller hvilken type objekter den operere på og den sidste (expression i mit tilfælde) er det data der skal opereres på. Altså den funktion man kalder metoden på.

I tilfældet med test funktionen indeholderMartin() er parameterne this, string og expression. This er påkrævet, string fortæller den at man kan kalde funktionen på string (skifter man det ud til object vil den være tilgængelig på alt der arver fra object) og expression er indholdet af den string man kalder funktionen på.

Der er følgende krav til extension metoder:

– Metoder skal tilføjes som statiske klasser.

– Extensions er ikke rigtigt en del af klassen, så du kan kun tilgå offentligt metoder og properties.

– Extension metoden skal være i det namespace den skal bruges i, eller inkluderes (med using).

– Extensions har kan ikke overwrite metoder, dvs hvis der allerede var en funktion i string der hedder indholderMartin() vil den blive brug frem for extension metoden.

Man behøver ikke udvide en specifik klasse, den følger med ved nedarvning så man kan også udvide Object som i følgende eksempel (brug med omtanke)! For give et lidt mere brugbart eksempel er der her en toInt() funktion på object, således at alle klasser får en toInt funktion lige som de har en toString().

public static int toInt(this Object expression)

            {

                   if (expression == null)

               {

                    throw new ArgumentNullException("expression");

               }



                                int i = int.MinValue;

                                int.TryParse(expression.ToString(), out i);

                                return i;

            }

Så kan man på et hvert objekt skrive .ToInt(),  uden at frygte exceptions.

En anden brugbar funktion er et null check:

public static bool isNotNull(this Object expression)

            {

                   if (expression == null)

               {

                  return false;

               }



                                return true;

            }

Denne funktionalitet kan man også bruge til at give default værdier til funktionen i tilfælde af at det objekt man kalder den på er null.

public static bool indeholderMartin(this string expression)

            {

                   if (expression == null)

               {

                  return false;

               }



                                if(expression.Contains("Martin"))

                                                return true;

                        return false;

            }