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
staticsau este generică/imbricată: eroare CS1106 sau CS1109. - Lipsa directivei
usingpentru namespace-ul extensiei: metoda „nu există” pe tip. - O extensie poate fi apelată pe
nullfără excepție la apel (este o metodă statică). Verifică explicitnullîn interior dacă e nevoie.
Comenzi înrudite
Membri de extensie: blocul extension (C# 14): C# 14 aduce blocul extension: proprietăți de extensie, metode și proprietăți statice de extensie, nu doar metode de instanță.Clase și membri static: Membrii static aparțin tipului, nu unui obiect; o static class conține doar membri statici și nu poate fi instanțiată.Constrângeri generice (where T : ...): Clauza where limitează tipurile acceptate de un generic (class, struct, new(), o interfață sau clasă de bază) ca să le poți folosi membrii.