次の方法で共有


列挙体の新しいメソッドを作成する方法 (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' キーワードに関する言語リファレンス記事を参照してください。

こちらもご覧ください