Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
È possibile usare metodi di estensione per aggiungere funzionalità specifiche di un particolare tipo di enumerazione. Nell'esempio seguente, l'enumerazione Grades rappresenta i possibili voti espressi con lettere che uno studente potrebbe ricevere in un corso. Un metodo di estensione denominato Passing viene aggiunto al Grades tipo in modo che ogni istanza di tale tipo ora "conosca" se rappresenta un grado di passaggio o meno.
public enum Grades
{
F = 0,
D = 1,
C = 2,
B = 3,
A = 4
};
// Define an extension method in a non-nested static class.
public static class Extensions
{
public static bool Passing(this Grades grade, Grades minPassing = Grades.D) =>
grade >= minPassing;
}
È possibile chiamare il metodo di estensione come se fosse stato dichiarato nel enum tipo :
Grades g1 = Grades.D;
Grades g2 = Grades.F;
Console.WriteLine($"First {(g1.Passing() ? "is" : "is not")} a passing grade.");
Console.WriteLine($"Second {(g2.Passing() ? "is" : "is not")} a passing grade.");
Console.WriteLine("\r\nRaising the bar!\r\n");
Console.WriteLine($"First {(g1.Passing(Grades.C) ? "is" : "is not")} a passing grade.");
Console.WriteLine($"Second {(g2.Passing(Grades.C) ? "is" : "is not")} a passing grade.");
/* Output:
First is a passing grade.
Second is not a passing grade.
Raising the bar!
First is not a passing grade.
Second is not a passing grade.
*/
A partire da C# 14, è possibile dichiarare membri di estensione in un blocco di estensione. La nuova sintassi consente di aggiungere proprietà di estensione. È anche possibile aggiungere membri di estensione che sembrano essere nuovi metodi o proprietà statici. Non sei più limitato alle estensioni che appaiono come metodi di istanza. L'esempio seguente mostra un blocco di estensione che aggiunge una proprietà di estensione dell'istanza per Passinge una proprietà di estensione statica per MinimumPassingGrade:
public static class EnumExtensions
{
private static Grades minimumPassingGrade = Grades.D;
extension(Grades grade)
{
public static Grades MinimumPassingGrade
{
get => minimumPassingGrade;
set => minimumPassingGrade = value;
}
public bool Passing => grade >= minimumPassingGrade;
}
}
Queste nuove proprietà di estensione vengono chiamate come se siano dichiarate nel tipo esteso:
Grades g1 = Grades.D;
Grades g2 = Grades.F;
Console.WriteLine($"First {(g1.Passing ? "is" : "is not")} a passing grade.");
Console.WriteLine($"Second {(g2.Passing ? "is" : "is not")} a passing grade.");
Grades.MinimumPassingGrade = Grades.C;
Console.WriteLine($"\r\nRaising the bar. Passing grade is now {Grades.MinimumPassingGrade}!\r\n");
Console.WriteLine($"First {(g1.Passing ? "is" : "is not")} a passing grade.");
Console.WriteLine($"Second {(g2.Passing ? "is" : "is not")} a passing grade.");
/* Output:
First is a passing grade.
Second is not a passing grade.
Raising the bar!
First is not a passing grade.
Second is not a passing grade.
*/
Per altre informazioni sui nuovi membri di estensione, vedere l'articolo sui membri dell'estensione e nell'articolo di riferimento sul linguaggio sulla extension parola chiave .