Compartir a través de


Cómo crear un nuevo método para una enumeración (Guía de programación de C#)

Puede usar métodos de extensión para agregar funcionalidad específica de un tipo de enumeración determinado. En el ejemplo siguiente, la enumeración Grades representa las posibles calificaciones con letras que un alumno puede recibir en una clase. Se agrega un método de extensión denominado Passing al tipo Grades para que cada instancia de ese tipo ahora "sepa" si representa una calificación de paso o no.

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;
}

Puede llamar al método de extensión como si se hubiera sido declarado en el tipo 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.
*/

A partir de C# 14, puede declarar miembros de extensión en un bloque de extensión. La nueva sintaxis permite agregar propiedades de extensión. También puede agregar miembros de extensión que parecen ser nuevos métodos o propiedades estáticos. Ya no está limitado a las extensiones que tienen apariencia de métodos de instancia. En el ejemplo siguiente se muestra un bloque de extensión que agrega una propiedad de extensión de instancia para Passingy una propiedad de extensión estática para 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;
    }
}

Estas nuevas propiedades de extensión se llaman como si se declararan en el tipo extendido:

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;
    }
}

Puede obtener más información sobre los nuevos miembros de extensión en el artículo sobre los miembros de la extensión y en el artículo de referencia del lenguaje sobre la palabra clave "extension".

Consulte también