Como funcionam os atributos em C #?
Em C #, atributos são tags de metadados atribuídas ao código, incluindo classes, tipos, métodos e campos. Usando reflexão, você pode examinar as tags para alterar comportamentos em seu programa. Mostraremos como usá-los e como escrever os seus próprios.
O que são atributos?
Simplificando, os atributos são tags de metadados que contêm algumas informações. A sintaxe para eles é o nome do tipo entre colchetes acima do código que está sendo marcado, assim:
[Atributo] Comando void () {
Eles podem ser anexados a praticamente qualquer coisa — classes, métodos, campos, estruturas, tipos, etc. Eles podem até receber parâmetros para fornecer entrada que pode ser acessada, embora sejam limitados a tipos básicos. Você pode definir parâmetros invocando o atributo como um método:
[Atributo ("nome", Teste = falso, Número = 42)]
Um caso de uso comum é marcar campos para serialização. C # tem uma tag [Serializable] interna, que oferece suporte à serialização de uma classe em bytes, e muitas bibliotecas de terceiros implementam suas próprias tags. Por exemplo, o driver C # para MongoDB inclui muitas tags para serializar para Bson e também uma tag especial que interpretará uma string como o ID do documento.
Outro caso de uso comum são os métodos de marcação que são gerenciados por um manipulador de comando de nível superior. Por exemplo, um Discord Bot, registra uma lista de comandos que são tratados sempre que alguém envia uma mensagem. Em vez de adicionar manualmente cada comando ao manipulador de comando toda vez que você escreve um novo, você pode marcar o método com [Command ("commandname")] e usar a solução genérica que irá adicioná-los automaticamente no tempo de execução.
Você pode ler a documentação da Microsoft para saber mais, mas eles são bastante simples.
Como fazer seus próprios atributos
Claro, você pode criar facilmente seus próprios atributos personalizados para aplicar às suas aulas. Tudo que você precisa fazer é criar uma classe que se estende de System. Attribute. Você também pode adicionar um atributo nesta classe especificando como ele deve ser usado; por exemplo, aplicando-se apenas a classes ou structs.
Então, você pode especificar campos e um construtor que pegará os parâmetros de entrada e preencherá os campos. Quando você usa este atributo, é como chamar um novo Atributo (parâmetros), exceto sem a nova palavra-chave.
[System. AttributeUsage (System. AttributeTargets. Class | System. AttributeTargets. Struct)] publicclassAuthorAttribute: System. Attribute {privatestring name; publicdouble version; publicAuthorAttribute (nome da string) {this. name = name; versão = 1.0; }}
Então você está livre para usá-los para marcar o seu código, desde que o atributo seja referenciado no código que está sendo marcado.
Para acessar os atributos de maneira programática, você &’ precisará usar reflexão. A reflexão não é ótima para o desempenho, mas para os casos de uso de atributos, isso geralmente não importa. Você pode usar Attribute. GetCustomAttributes para retornar um Attribute [], passando o tipo da classe:
System. Attribute. GetCustomAttributes (typeof (className));
Se você deseja acessar todas as instâncias de atributos em seu assembly, você pode usar Assembly. GetExecutingAssembly (). GetTypes () para buscar uma lista de tipos em execução e, em seguida, verificar todos os atributos personalizados desse tipo para ver se ele contém o parâmetro de pesquisa, opcionalmente filtrando essa lista com base no tipo de classe à qual o atributo está anexado.
var plugins = Assembly. GetExecutingAssembly (). GetTypes () . Where (t = > t. IsClass & & t. BaseType == typeof (BasePlugin) & & Attribute. GetCustomAttributes (t ). Qualquer ((atr) = > atr. GetType () == typeof (MyCustomAttribute))) . ToList ();
Para acessar os parâmetros do atributo, basta acessá-los diretamente da classe Attribute, como qualquer outra propriedade pública.
Via: How to Geek
Nenhum comentário