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