共用方式為


如何建立列舉的新方法(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;
    }
}

您可以呼叫這些新的延伸模組屬性,就像這些屬性在擴充類型上宣告一樣:

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

您可以在關於擴充成員的文章以及關於extension關鍵字的語言參考文章中進一步瞭解新的擴充成員。

另請參閱