Dela via


Så här skapar du en ny metod för en uppräkning (C#-programmeringsguide)

Du kan använda tilläggsmetoder för att lägga till funktioner som är specifika för en viss uppräkningstyp. I följande exempel Grades representerar uppräkningen de möjliga bokstavsbetyg som en elev kan få i en klass. En tilläggsmetod med namnet Passing läggs till i den Grades typen så att varje instans av den typen nu "vet" om den representerar ett godkänt betyg eller inte.

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;
}

Du kan anropa tilläggsmetoden som om den deklarerades på typen enum :

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.
*/

Från och med C# 14 kan du deklarera tilläggsmedlemmar i ett tilläggsblock. Med den nya syntaxen kan du lägga till tilläggsegenskaper. Du kan också lägga till tilläggsmedlemmar som verkar vara nya statiska metoder eller egenskaper. Du är inte längre begränsad till tillägg som verkar vara instansmetoder. I följande exempel visas ett tilläggsblock som lägger till en instanstilläggsegenskap för Passingoch en statisk tilläggsegenskap för 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;
    }
}

Du anropar dessa nya tilläggsegenskaper som om de deklareras för den utökade typen:

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;
    }
}

Du kan läsa mer om de nya tilläggsmedlemmarna i artikeln om tilläggsmedlemmar och i språkreferensartikeln om nyckelordet "extension".

Se även