拡張メソッドを使用して、特定の列挙型に固有の機能を追加できます。 次の例では、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' キーワードに関する言語リファレンス記事を参照してください。
こちらもご覧ください
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET