Extension methods (metody rozszerzające)
Metody rozszerzające zostały wprowadzone w C # 3.0. Metody rozszerzające rozszerzają i dodają zachowanie do istniejących już typów bez tworzenia nowego typu pochodnego, rekompilacji lub innej modyfikacji oryginalnego typu.
Są one szczególnie przydatne, gdy nie można zmodyfikować źródła typu, który chcemy ulepszyć.
Metody rozszerzeń mogą być tworzone dla typów systemowych, oraz typów definiowanych przez osoby trzecie i typów, które sami napisaliśmy.
Metoda rozszerzająca może być wywołana tak, jakby była metodą członka oryginalnego typu.
Umożliwia to stosowanie metody łańcuchowania do implementacji płynnego interfejsu.
Metoda rozszerzająca jest tworzona przez dodanie metody statycznej do klasy statycznej, która różni się od rozszerzanego typu oryginalnego. Klasa statyczna trzymająca metodę rozszerzająca jest często tworzona wyłącznie w celu utrzymywania metod rozszerzających.
Metody rozszerzające przyjmują specjalny pierwszy parametr oznaczający przedłużenie pierwotnego typu.
Ten pierwszy parametr jest ozdobiony słowem kluczowym this (co stanowi szczególne i wyraźne użycie tego w C # – i należy to rozumieć jako coś innego niż użycie tego, co pozwala na odnoszenie się do członków bieżącej instancji obiektu).
W poniższym przykładzie rozszerzymy typ string.
String zostanie rozszerzony za pomocą metody Shorten(), która zapewnia dodatkową funkcjonalność skracania.
Klasa StringExtensions to klasa statyczna która została utworzona w celu przechowywania metody rozszerzającej.
Metoda rozszerzająca Shorten() pokazuje, że jest rozszerzeniem stringa za pomocą specjalnie oznaczonego pierwszego parametru.
Aby pokazać, że metoda Shorten() rozszerza typ string, pierwszy parametr jest oznaczany jako this.
Dlatego pełną sygnaturą pierwszego parametru jest this string text, w którym
string jest rozszerzany, a tekst jest nazwą wybranego parametru.
Obiektem przekazanym jako pierwszy argument metody rozszerzającej (której towarzyszy słowo kluczowe this) jest instancja, do której wywoływana jest metoda rozszerzenia.