Erweiterungsmethode
Als Erweiterungsmethode (engl. extension method) wird unter .NET eine Methode bezeichnet, die eine Klasse oder Schnittstelle[1] erweitert, ohne Teil der Implementierung der erweiterten Klasse zu sein. Es wirkt dabei nur auf den ersten Blick wie Mehrfachvererbung. Es handelt sich dabei allerdings um syntaktischen Zucker, also einen Compilertrick, der die Erweiterungsmethode der Klasse zuordnet.
Anwendung
Erweiterungsmethoden werden in C# in einer statischen Klasse als statische Methode definiert. Das Schlüsselwort this vor dem ersten Parameter definiert den zu erweiternden Typen. Dieser erste Parameter wird beim Aufruf nicht mit übergeben.
Im Beispiel soll die Klasse System.String um eine weitere Substring-Anweisung ergänzt werden:
public static class MyStringExtensions
{
public static string MySubstring(this string me, int position, int length)
{
//beliebige Logik
return "My" + me.Substring(position, length);
}
}
// Die Schnittstelle IEnumerable<T> wird mit "IsNullOrEmpty()" erweitert.
public static class IEnumerableExtensions
{
public static bool IsNullOrEmpty<T>(this IEnumerable<T> x)
=> (x == null || x.Count() < 1);
}
Verwendung:
string teststring = "test";
teststring.MySubstring(1, 2);
IEnumerable<int> list = someObject.GetNumbers();
bool isNullOrEmpty = list.IsNullOrEmpty();
Vorteile
- Erweiterung beliebiger Klassen, auch "sealed" Klassen wie System.String
- Hinzufügen einer konkret implementierten Methode an ein Interface und damit an aller darauf aufbauenden Klassen (z. B. IList)
- Es ist nicht mehr nötig ganze Klassen abzuleiten um eigene Features hinzuzufügen
Nachteile
- Extensions werden durch eine Using Direktive verfügbar. Hier können Namespacekonflikte entstehen.
- Durch intensive Verwendung von Extension Methods kann der Code unübersichtlich werden
Literatur
- Erweiterungsmethoden im Buch Visual C# 2010 – Das umfassende Handbuch von Andreas Kühnel, Rheinwerk Verlag, Bonn 2010, ISBN 978-3-8362-1552-7
Weblinks
Einzelnachweise
- Extension Methods - C# Programming Guide. Abgerufen am 21. März 2021 (amerikanisches Englisch).