可以使用扩展方法添加特定于特定枚举类型的功能。 在下面的示例中, 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;
}
}
可以在 有关扩展成员 的文章和 “扩展”关键字的语言参考文章中了解有关新扩展成员的详细信息。