C# – Mit Extension Methods Objekte mit Funktionalitäten erweitern

Beim Aufräumen auf meinem Schreibtisch hab ich einen Zettel gefunden den ich mal zu ExtensionMethods in .NET/C# geschriebn hatte.
Dies mag zwar schon ein etwas älteres Thema sein, aber da ich bis jetzt noch keinen Blog-Eintrag darüber geschrieben habe, werde ich dies jetzt tun 🙂
Viel zu sagen gibt es zu dem Thema nicht – außer das man mit Hilfe von ExtensionMethods die Funktionalitäten von .NET Standard-Objekten erweitern kann.

Ok, fangen wir mal ganz einfach mit einem Beispiel an.
Nehmen wir mal das Int Objekt. Wenn man sich die Methoden dieses Int im Intellisense auflisten lässt, stellt man ziemlich shcnell fest, das es nicht wirklich viel kann – was soll so ein Basis-Objekt auch können?
Die Hauptaufgabe des Int ist es auch nur einen Wert zu speichern – einen Integer Wert – und das schafft dieses Objekt ziemlich gut.

Nehmen wir nun an, wir wollen mit diesem Objekt rechnen, was gar nicht mal so selten vor kommt.
Hier eine kleine Methode, mit welcher wir den Wert eines Int verdoppelt können:

1
2
3
4
private int Double(int i)
{
	return i * 2;
}

Wenn ich diese Methode wie folgt aufrufe, bekomme ich als Ergebnis eine 4:

1
2
int i = 2;
Console.WriteLine(Double(i));  // Ergebnis: 4

Hierfür müsste ich allerdings eine eigene Klasse schreiben, was ich unter umständen nicht möchte, weil ich so eine Funktion evtl. öfter brauche.
Würden wir aus dieser Methode nun eine ExtensionMethod bauen, würde sie wie folgt aussehen:

1
2
3
4
5
6
7
static class ExtensionMethods
{
	public static int Double(this int i)
	{
		return i * 2;
	}
}

Und der Aufruf würde sich wie folgt ändern:

1
2
int i = 2;
Console.WriteLine(i.Double());  // Ergebnis: 4

Die Methode „Double“ ist nun nicht mehr eine Methode irgendeiner Klasse, sondern direkt vom Objekt Int.
Nun ist Dounble() keine wirklich Sinnvolle Funktionalität, aber auf diese Art und weise könnte man sich auch z.B. ein „ToBoolean()“ bauen.
Dieser würde dann so aussehen:

1
2
3
4
5
6
7
static class ExtensionMethods
{
	public static bool ToBoolean(this int i)
	{
		return Convert.ToBoolean(i);
	}
}

Und passend dazu folgender Aufruf:

1
2
3
4
5
6
7
int i;
i = 0;
Console.WriteLine(i.ToBoolean());  // false
i = 1;
Console.WriteLine(i.ToBoolean());  // true
i = 2;
Console.WriteLine(i.ToBoolean());  // true

Diese Funktionalität macht schon mehr Sinn 🙂

Wichtig beim Bau von ExtensionMethods ist, dass die Methoden Static sind und das der erste Parameter der Methode das Objekt ist welches ich um diese Methode erweitern möchte.
Möchte ich z.B. ein int erweitern, muss ich als ersten Parameter ein „this int varname“ angeben.

1
2
3
4
5
6
7
static class ExtensionMethods
{
	public static int Double(this int i)
	{
		// Inhalt der Methode
	}
}

Bei einem String dann analog dazu: „this string varname“.

1
2
3
4
5
6
7
static class ExtensionMethods
{
	public static bool ToBoolean(this string s)
	{
		// Inhalt der Methode
	}
}

Alle weiteren Parameter sind dann die Parameter der Methode, welche in der Methode übergeben werden können.

leave your comment


*

Unterstütze den Frickelblog!