如何:为枚举创建新方法(C# 编程指南)

可以使用扩展方法添加特定于某个特定枚举类型的功能。

示例

在下面的示例中,Grades 枚举表示学生可能在班里收到的字母等级分。 该示例将一个名为 Passing 的扩展方法添加到 Grades 类型中,以便该类型的每个实例现在都“知道”它是否表示合格的等级分。

using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;

namespace EnumExtension
{
    // Define an extension method in a non-nested static class.
    public static class Extensions
    {        
        public static Grades minPassing = Grades.D;
        public static bool Passing(this Grades grade)
        {
            return grade >= minPassing;
        }
    }

    public enum Grades { F = 0, D=1, C=2, B=3, A=4 };
    class Program
    {       
        static void Main(string[] args)
        {
            Grades g1 = Grades.D;
            Grades g2 = Grades.F;
            Console.WriteLine("First {0} a passing grade.", g1.Passing() ? "is" : "is not");
            Console.WriteLine("Second {0} a passing grade.", g2.Passing() ? "is" : "is not");

            Extensions.minPassing = Grades.C;
            Console.WriteLine("\r\nRaising the bar!\r\n");
            Console.WriteLine("First {0} a passing grade.", g1.Passing() ? "is" : "is not");
            Console.WriteLine("Second {0} a passing grade.", g2.Passing() ? "is" : "is not");
        }
    }
  }
}
/* 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.
 */

请注意,Extensions 类还包含一个动态更新的静态变量,并且扩展方法的返回值反映了该变量的当前值。 这表明在幕后,将在定义扩展方法的静态类上直接调用这些方法。

编译代码

若要运行这段代码,请将其复制并粘贴到已经在 Visual Studio 中创建的 Visual C# 控制台应用程序项目中。 默认情况下,此项目针对的是 .NET Framework 3.5 版,并且具有一个对 System.Core.dll 的引用和一条针对 System.Linq 的 using 指令。 如果项目不满足上面的一个或多个要求,则您可以手动添加它们。 有关更多信息,请参见如何:创建 LINQ 项目

请参见

参考

扩展方法(C# 编程指南)

概念

C# 编程指南