Практическое руководство. Руководство по программированию на C#. Создание метода для перечисленияHow to: Create a New Method for an Enumeration (C# Programming Guide)

Методы расширения позволяют добавить функциональные возможности, характерные для определенного типа перечисления.You can use extension methods to add functionality specific to a particular enum type.

ПримерExample

В следующем примере перечисление Grades содержит возможные буквенные оценки, которые учащийся может получить в классе.In the following example, the Grades enumeration represents the possible letter grades that a student may receive in a class. Метод расширения с именем Passing добавляется в тип Grades, чтобы каждый экземпляр этого типа "знал", проходной это балл или нет.An extension method named Passing is added to the Grades type so that each instance of that type now "knows" whether it represents a passing grade or not.

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 также содержит статическую переменную, которая обновляется динамически, а возвращаемое значение метода расширения отражает текущее значение этой переменной.Note that the Extensions class also contains a static variable that is updated dynamically and that the return value of the extension method reflects the current value of that variable. Это показывает, что в фоновом режиме методы расширения вызываются непосредственно для статического класса, в котором они определены.This demonstrates that, behind the scenes, extension methods are invoked directly on the static class in which they are defined.

См. такжеSee also