Extension Methods erstellen

Extension Methods erstellen
Page content

Dieser Artikel gibt dir einen Einblick, wie du eigene Extension Methods schreiben kannst. Extension Methods wurden vor allem durch LINQ bekannt.

Was sind extension Methods?

Extension Methods sind wie „normale“ Methoden, welche wie Klassenmethoden aufgerufen werden. Der Unterschied zu Klassenmethoden besteht beim Definieren. Klassenmethoden werden innerhalb der Klasse definiert. Extension Methods werden in einer externen Klasse definiert und können jede beliebige Klasse erweitern.

Erstellen von Extension Methods

Doch wie erstellen wir nun eine Extension Method? Hierzu erstellen wir eine neue statische Klasse. Innerhalb dieser Klasse erstellen wir eine statische Methode. Diese Methode muss als ersten Parameter den Typ beinhalten und mit this verknüpft werden. Das sieht dann folgendermaßen aus:

public static class StringExtensions{
  public static string DoSomething(this string parameter) {
    return parameter;
  }
}

Diese Methode gibt den Parameter unverändert zurück. Wir können allerdings eine neue Methode erstellen, welche die Zeichenkette an den Leerzeichen trennt.

public static string[] GetSegments(this string parameter) {
  return parameter.Split(' ');
}

Der Aufruf erfolg wie bei jeder beliebigen Zeichenkette:

string sentence = "Hello World! How are you?";
string[] segments = sentence.GetSegments();

Durch extension Methods kann jede beliebige Klasse erweitert werden. Beispielsweise könnte es spezielle Methoden zum Debuggen geben. Auch Klassen aus einem fremden Framework können erweitert werden, um zusätzliche Funktionen zu erhalten. Je nach Struktur ist auch eine Verkettung möglich ( z.B. bei LINQ mit myList.Where(..).Select(..)).

Vorteile, Tipps und Fallstricke

Wie man im oberen Beispiel erkennen kann, sind Erweiterungen einfach realisierbar. Der Code wird auch nicht übermäßig länger. Im Vergleich mit statischen Helper-Klassen wird der Aufruf kürzer und besser lesbar. Vor allem bei der Schachtelung von mehreren Aufrufen haben kürzen Extension Methods die Aufrufe sehr stark ab.

// Helper-class vs extension Method
string[] segments = StringHelper.GetSegments(myString);
string[] segments = myString.GetSegments();

// Nested helper-class vs method chaining
string result = StringHelper.Bar(StringHelper.Foo(myString));
string result = myString.Foo().Bar();

Klassennamen, welche die Erweiterungen enthalten, sollten immer als TYPE + „Extension“ aufgebaut sein (z.B. StringExtension, MyClassExtension, IntExtension, AddressExtension). Dadurch wird schnell ersichtlich, für welche Typen diese Klasse Erweiterungen bereitstellt.

Es ist jedoch darauf zu achten, dass eine Methodendeklaration in der Klasse die ExtensionMethod überschreibt. Beispiel:

public class MyClass {
  public void Foo() {
    // Class method
  }
}

public static class MyClassExtension {
  public static void Foo(this MyClass parameter) {
    // Extension method
  }
}


// Program.cs
MyClass mc = new MyClass();
mc.Foo();

Habt ihr noch Tipps und Tricks für Extension Methods oder besondere Anwendungsfälle? Ich freue mich über eure Kommentare 🙂