Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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".