Поделиться через


Создание нового метода для перечисления (руководство по программированию на C#)

Методы расширения можно использовать для добавления функциональности, относящейся к конкретному типу перечисления. В следующем примере перечисление Grades представляет возможные буквенные оценки, которые студент может получить в классе. Метод расширения Passing добавляется к типу Grades, чтобы каждый экземпляр этого типа теперь "содержал информацию", представляет ли он проходной балл или нет.

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

Метод расширения можно вызвать так, как будто он был объявлен в типе 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.
*/

Начиная с C# 14, вы можете объявлять члены расширения в блоке расширений. Новый синтаксис позволяет добавлять свойства расширения. Вы также можете добавить элементы расширения, которые, как представляется, являются новыми статическими методами или свойствами. Вы больше не ограничены расширениями, которые выглядят как методы экземпляра. В следующем примере показан блок расширения, добавляющий свойство расширения экземпляра для Passing, и статическое свойство расширения для 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;
    }
}

Вы вызываете эти новые свойства расширения, как если бы они объявлялись в расширенном типе:

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

Дополнительные сведения о новых расширяемых членах см. в статье о расширяемых членах и в справочной статье по языку о ключевом слове `extension`.

См. также

  • Методы расширения