Compartilhar via


Como criar um novo método para uma enumeração (Guia de Programação em C#)

Você pode usar métodos de extensão para adicionar funcionalidades específicas a um tipo de enumeração específico. No exemplo a seguir, a enumeração Grades representa as notas em letras possíveis que um aluno pode receber em uma classe. Um método de extensão chamado Passing é adicionado ao tipo Grades, de modo que cada instância desse tipo agora saiba se representa uma nota de aprovação ou não.

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

Você pode chamar o método de extensão como se ele fosse declarado no enum tipo:

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 do C# 14, você pode declarar membros de extensão em um bloco de extensão. A nova sintaxe permite que você adicione propriedades de extensão. Você também pode adicionar membros de extensão que parecem ser novos métodos estáticos ou propriedades. Você não está mais limitado a extensões que parecem ser métodos de instância. O exemplo a seguir mostra um bloco de extensão que adiciona uma propriedade de extensão de instância para Passing e uma propriedade de extensão 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;
    }
}

Você chama essas novas propriedades de extensão como se elas fossem declaradas no tipo estendido:

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

Você pode saber mais sobre os novos membros da extensão no artigo sobre membros da extensão e no artigo de referência da linguagem na palavra-chave "extensão".

Consulte também

  • Métodos de Extensão