如何为枚举创建新方法 (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;
    }
}

可以在 有关扩展成员 的文章和 “扩展”关键字的语言参考文章中了解有关新扩展成员的详细信息。

另请参阅