Wie ihr sicherlich alle wisst, ist es nur sehr mühsam möglich kompilierte Klassen mit zusätzlicher Funktionalität zu bestücken oder etwa Funktionalität wieder wegzunehmen. Extension Methods erlauben in C#2008 an bestehenden Klassen oder sogar vorkompilierten Typen zusätzliche Funktionalität zu “injezieren” ohne den Code selber zu besitzen.
Einschränkungen
- Extension Methods verändern nicht die kompilierte Codebasis sondern fügen nur Member einem Typ hinzu, der im Kontext der Applikation läuft.
- Extension Methods müssen in einer statischen Klasse definiert werden. Die Methode selber muss auch mit dem Keyword static deklariert werden.
- Extension Methoden müssen im ersten Parameter der Methode immer mit dem Keyword this und der Klasse (z.B. this Object)auf den die Extensionmethode angewendet werden soll, implementiert werden.
- Jede Extensionmethode kann entweder über eine korrekte Instanz im Memory oder statisch über die definierende Klasse angesprochen werden!
Machen wir direkt ein Beispiel. Wir wollen, dass jede Klasse die von System.Object ableitet in Zukunft eine Methode DoPublicRelationForTracelight() besitzt, die auf der Konsole eine Meldung der Form “Tracelight.ch rockz!!!” ausgibt. Dazu definieren wir folgendes
static class TracelightPublicRelationExtensionMethods {
public static DoPublicRelationForTracelight(this Object obj) {
Console.WriteLine("Tracelight.ch rockz!");
}
// More methods related to tracelight.ch public relations...
}
Falls wir nun die Extensionmethoden über den zugehörigen Namespace in unser Programm einbinden, kann jede Klasse die von System.Object ableitet die Methode DoPublicRelationForTracelight() ausführen, als ob die Methode direkt auf dem System.Object definiert wurde.
Somit ist also folgendes möglich:
Object myObject = new Object();
myObject.DoPublicRelationForTracelight();
int myInt = 42;
myInt.DoPublicRelationForTracelight();
// and many more
Auch kann die statische Methode direkt über die Klasse aufgerufen werden. Also zum Beispiel so:
int myInt = 42;
TracelightPublicRelationExtensionMethods.DoPublicRelationForTracelight(myInt);
Im Hintergrund macht eigentlich der Kompiler auch nichts anderes als die statische Methode aufzurufen und eine Referenz des aufrufenden Objektes zu übergeben. Dies passiert einfach im Hintegrund.
Skope
Extensionmethoden haben keinen direkten Zugriff auf die Felder des Typs der von der Methode erweitert wird. Folgender Code ist also nicht möglich:
public class TracelightTvSpot {
public string TvSpotMessage ;
public string MakeAggressivPublicRelationForTracelight() {
return TvSpotMessage;
}
}
public static class TracelightPublicRelationExtensionMethods {
public static string MakeMoreAggressivSpot(this TracelightTvSpot spot) {
return TvSpotMessage + "! For real!!!";
}
}
Die obige Extensionmethode kann aber folgendermassen umgeschrieben werden:
public static class TracelightPublicRelationExtensionMethods {
public static string MakeMoreAggressivSpot(this TracelightTvSpot spot) {
return spot.TvSpotMessage + "! For real!!!";
}
}
Spezielles
Die Extensionmethoden werden bei der Verwendung durch Intellisense mit einem speziellen Symbol gekennzeichnet, damit sie von den Klassen- und statischen Methoden unterschieden werden können. Das Symbol sieht folgendermassen aus:
Die Extensionmethode müssen explizit über die Library die die Extensionmethoden definiert über das using Statement eingebunden werden. Sonst können sie nicht benutzt werden.
Viel Spass beim ausprobieren…