Extension Methods

Mit Extension Methods können bestehende Typen mit zusätzlichen Methoden erweitert werden. Diese Methoden sehen aus wie Instanz-Methoden, sind jedoch statische Methoden einer Hilfsklasse.

Sie haben einen speziellen Syntax. Der erste Parameter einer Extension Methode kennzeichnet die jeweilige Klasse, die erweitert werden soll. Zudem muss er mit this markiert werden. Zudem muss die Klasse, welche die Extension Methode behinhaltet und auch die Methode statisch sein.

Beispie zur Erweiterung der string-Klasse:

public static class StringExtensions
{
public static bool StartsWithUpperCase(this string value)
{
if (value.Length > 0) return char.IsUpper(value[0]);
return false;
}
}

Danach kann die Methode benutzt werden:

string s = „Test“;
bool b = s.StartsWithUpperCase();

Was macht der Compiler im Hintergrund? Schauen wir uns das Code-Stück davon mal in IL-Code an:

.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 20 (0x14)
.maxstack 1
.locals init ([0] string s)
IL_0000: nop
IL_0001: ldstr „Hallo“
IL_0006: stloc.0
IL_0007: ldloc.0
IL_0008: call string MyApp.StringExtensions::TimWhiteSpaces(string)
IL_000d: callvirt instance string [mscorlib]System.String::ToUpper()
IL_0012: stloc.0
IL_0013: ret
} // end of method Program::Main

Die Extension Methode wird ganz normal als Klassenmethode aufgerufen. War ja nicht anders zu erwarten. Die Extenstion Methoden sind somit nur eine Hilfe für faule Programmierer :-).

Method Chaining

In vielen Fällen ist es hilfreich, wenn man das Method Chaining unterstützt. Dies bedeutet, dass man anstelle von void den jeweiligen Typen wieder zurückgibt.

public static class StringExtensions
{
public static string TimWhiteSpaces(this string value)
{
return value.Trim(‚ ‚, ‚\t‘, ‚\r‘, ‚\n‘);
}
}

Somit können auf dem Rückgabe-Objekt weitere Methoden aufgerufen werden:

string s = „\tTest  „;
s = s.TimWhiteSpaces().ToUpper();

Meine Empfehlung

Extension Methods sind cool – nichts desto trotz verschlechtern sie meines Erachtens eher das Software-Design. Im Hintergrund bleibt alles beim Alten. Es wird dem Entwickler einfach vorgegaukelt, es handle sich um eine Instanzmethode. Zudem kann es häufig der Fall sein, dass man in einem Modul eine Extension Methode benutzen möchte (an welche man sich gewöhnt hat), diese jedoch nicht auffindbar ist. Dann geht die Suche los, in welche Klasse sich diese Methode befinden, damit man sie inkludieren und benutzen kann. Soweit ich weiss, hat Microsoft die Extension Methoden eingeführt, damit LINQ gut ins Framework integriert werden konnte. Ich empfehle somit, alle eigenen Extenstion Methoden in ein spezielles Assembly auszulagern und nur zu verwenden, wenn es die Arbeit massiv erleichtet.