Udostępnij za pomocą


Jak utworzyć nową metodę dla wyliczenia (Przewodnik programowania w języku C#)

Można zastosować metody rozszerzeń, aby dodać funkcjonalność specyficzną dla określonego typu wyliczenia. W poniższym przykładzie Grades wyliczenie reprezentuje możliwe oceny literowe, które student może otrzymać na kursie. Metoda rozszerzenia o nazwie Passing jest dodawana do typu Grades, aby każde wystąpienie tego typu "wiedziało", czy reprezentuje ocenę pozytywną, czy nie.

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

Metodę rozszerzenia można wywołać tak, jakby została zadeklarowana w typie 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.
*/

Począwszy od języka C# 14, można zadeklarować elementy członkowskie rozszerzenia w bloku rozszerzenia. Nowa składnia umożliwia dodawanie właściwości rozszerzenia. Można również dodać elementy członkowskie rozszerzenia, które wydają się być nowymi metodami statycznymi lub właściwościami. Nie jesteś już ograniczony do rozszerzeń, które wyglądają na metody instancji. W poniższym przykładzie pokazano blok rozszerzeń, który dodaje właściwość rozszerzenia dla wystąpienia Passing oraz właściwość dla statycznego rozszerzenia 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;
    }
}

Te nowe właściwości rozszerzenia są wywoływane tak, jakby zostały zadeklarowane w typie rozszerzonym:

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

Więcej informacji o nowych członkach rozszerzenia można znaleźć w artykule na temat składowych rozszerzeń oraz w artykule referencyjnym języka dotyczącym słowa kluczowegoextension.

Zobacz też

  • metody rozszerzenia