Novidades do C# 11: Generic Attributes
Outra novidade trazida pelo C# 11 está na possibilidade de uso de Generics na definição de classes que implementam atributos. Tal limitação em versões anteriores obrigava à utilização de um parâmetro recebendo uma instância de System.Type, em cenários nos quais metadados envolvendo a manipulação de tipos se faziam necessários em um Attribute.
Vale lembrar ainda que implementações de atributos estão normalmente associadas ao uso de recursos presentes no namespace System.Reflection, em construções relacionadas a configurações de frameworks e estruturas que determinem comportamentos básicos de uma aplicação.
Na listagem a seguir temos um exemplo simples de utilização de Generics em um Attribute, através da implementação da classe DocumentAttribute:
- O tipo associado ao placeholder T será atribuído à propriedade Document;
- A expressão AttributeUsage(AttributeTargets.Class) indica que DocumentAttribute poderá ser aplicado apenas na declaração de classes.
O atributo Document (na prática o tipo DocumentAttribute) foi então associado às seguintes classes (por convenção omitimos o termo Attribute ao vincular esse elemento a uma construção de código):
- TransacaoDebito e TransacaoPix, recebendo como parâmetro o tipo JsonDocument (namespace System.Text.Json);
- NotaFiscalEletronica e NotaFiscalServicos, em que foi especificado o tipo XDocument (namespace System.Xml.Linq) como parâmetro.
E finalmente chegamos ao arquivo Program.cs, testando as estruturas aqui apresentadas:
- Foi definido um array (types) referenciado os tipos NotaFiscalEletronica, TransacaoPix, TransacaoDebito e NotaFiscalServicos;
- Um loop foreach percorrerá este array, acionando o método GetCustomAttributes para cada tipo;
- O retorno de GetCustomAttributes também será analisado, com a exibição de informações sobre um tipo caso este conte com o atributo Document referenciando JsonDocument ou XDocument.
O resultado da execução desta Console Application a partir do Visual Studio 2022 pode ser observado na imagem a seguir:
Esse exemplo está disponível no GitHub:
https://github.com/renatogroffe/CSharp11-GenericAttributes
Caso achem útil a solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!
Apresentei também em detalhes esta e outras novidades do C# 11 em uma live recente no Canal .NET, cujo conteúdo pode ser assistido gratuitamente no YouTube:
E concluo este post com um convite…
Neste novo evento ONLINE e GRATUITO do Canal .NET erão apresentadas as principais novidades que integram o .NET 7, com exemplos de implementação já utilizando o C# 11 e o ASP.NET Core.
Quando: 27/02/2023 (segunda) a partir das 21:00 — horário de Brasília
Faça sua inscrição em:
https://bit.ly/live-dotnet7-novidades