Novidades do C# 11: Generic Attributes

Renato Groffe
2 min readFeb 1, 2023

--

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:

Clique nesta imagem para visualizar com uma melhor resolução

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

--

--

Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker