Metode de extensie (this) în C# (.NET)

Adaugă metode unui tip existent (string, int, interfețe) fără să-l modifici: metodă statică cu this în fața primului parametru.

Sintaxă C#
static class Ext { public static string Initiala(this string s) => s[..1]; }   "Ana".Initiala()

Ce face Metode de extensie (this)

O metodă de extensie este o metodă static dintr-o static class negenerică, al cărei prim parametru are cuvântul this. Compilatorul permite apelul ei ca și cum ar fi metodă a tipului: text.Initiala() devine în spate TextExt.Initiala(text).

Așa este construit LINQ: Where, Select și celelalte sunt metode de extensie pentru IEnumerable<T>. Metodele devin vizibile doar unde namespace-ul clasei statice este importat cu using. Dacă tipul are deja o metodă de instanță cu aceeași semnătură, aceea câștigă.

Din C# 14 există și blocurile extension, care permit proprietăți și membri statici de extensie. Metodele de extensie clasice rămân valabile și sunt compatibile cu ele.

Exemple

Exemplul 1: Extensii pentru string și int

Console.WriteLine("ana maria".Majuscula());
Console.WriteLine("Iași".EsteGol());
Console.WriteLine(1250.InLei());

static class Extensii
{
    public static string Majuscula(this string s) =>
        s.Length == 0 ? s : char.ToUpper(s[0]) + s[1..];

    public static bool EsteGol(this string? s) => string.IsNullOrWhiteSpace(s);

    public static string InLei(this int suma) => $"{suma} lei";
}

Rezultat

Ana maria
False
1250 lei

Exemplul 2: Extensie generică pentru IEnumerable

Metoda funcționează pe orice colecție, la fel ca operatorii LINQ.

int[] note = [10, 7, 9];
List<string> orase = ["Iași", "Cluj"];

Console.WriteLine(note.CaText());
Console.WriteLine(orase.CaText(" | "));

static class ColectiiExt
{
    public static string CaText<T>(this IEnumerable<T> elemente, string separator = ", ") =>
        "[" + string.Join(separator, elemente) + "]";
}

Rezultat

[10, 7, 9]
[Iași | Cluj]

Greșeli frecvente

  • Clasa care conține extensia nu este static sau este generică/imbricată: eroare CS1106 sau CS1109.
  • Lipsa directivei using pentru namespace-ul extensiei: metoda „nu există” pe tip.
  • O extensie poate fi apelată pe null fără excepție la apel (este o metodă statică). Verifică explicit null în interior dacă e nevoie.

Comenzi înrudite