Instrukcje: Tworzenie nowej metody dla wyliczenia (C# Przewodnik programowania)How to: Create a New Method for an Enumeration (C# Programming Guide)

Można użyć metod rozszerzających, aby dodać funkcje specyficzne dla określonego typu wyliczeniowego.You can use extension methods to add functionality specific to a particular enum type.

PrzykładExample

W poniższym przykładzie Grades Wyliczenie reprezentuje możliwe klasy liter, które student może odebrać w klasie.In the following example, the Grades enumeration represents the possible letter grades that a student may receive in a class. Metoda rozszerzenia o nazwie Passing jest dodawana Grades do typu, tak aby każde wystąpienie tego typu było teraz "znane", niezależnie od tego, czy reprezentuje ona przewagę, czy nie.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.
 */

Należy zauważyć, Extensions że Klasa zawiera również zmienną statyczną, która jest aktualizowana dynamicznie i że wartość zwracana metody rozszerzenia odzwierciedla bieżącą wartość tej zmiennej.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. Pokazuje to, że w tle metody rozszerzające są wywoływane bezpośrednio w klasie statycznej, w której są zdefiniowane.This demonstrates that, behind the scenes, extension methods are invoked directly on the static class in which they are defined.

Zobacz takżeSee also