Resumo : neste tutorial, você aprenderá como criar atributos C# para adicionar metadados ao seu código e como escrever um atributo personalizado.
Introdução aos atributos C#
Em C#, um atributo é uma tag declarativa que você pode aplicar a classes , métodos, propriedades e outros elementos de código.
Um atributo fornece informações adicionais sobre o elemento de código ao qual é aplicado. Por exemplo, você pode usar um atributo para indicar como um objeto deve ser serializado.
Todos os atributos da classe herdam da System.Attribute
classe. Além de fornecer atributos integrados, você pode criar classes de atributos customizados que estendem a System.Attribute
classe.
O exemplo a seguir demonstra como usar um atributo interno Serializable
para a Person
classe. O Serializable
atributo instrui o .NET que a Person
classe pode ser serializada em um formato binário:
[Serializable]
class Person
{
public string? Name { get; set; }
public sbyte? Age { get; set; }
}
Linguagem de código: C# ( cs )
Por que você precisa de atributos C#?
Os atributos adicionam metadados ao seu código para que o .NET ou outras ferramentas possam usá-los em tempo de execução. Por exemplo, o Visual Studio IDE usa atributos para fornecer sugestões de IntelliSense e de conclusão de código. Além disso, o tempo de execução do .NET usa atributos para determinar como executar seu código.
Os atributos também podem ser úteis para impor convenções de codificação. Por exemplo, você pode usar o Obsolete
atributo para marcar um método de uma classe como obsoleto. Em seguida, o Visual Studio poderá emitir um aviso se você tentar chamar o método obsoleto.
Criando um atributo personalizado
O programa a seguir demonstra como criar um atributo personalizado chamado Author
:
[AttributeUsage(AttributeTargets.Class)]
class Author : Attribute
{
public string Name
{
get; set;
}
public Author(string name)
{
Name = name;
}
}
[Author("John Doe")]
class Person
{
}
class Program
{
public static void Main(string[] args)
{
// get all custom attributes of the Person class
var attributes = Attribute.GetCustomAttributes(typeof(Person));
// Retrieve the author attribute
var author = attributes.OfType<Author>().Single();
Console.WriteLine(author.Name);
}
}
Linguagem de código: C# ( cs )
Saída:
John Doe
Como funciona.
Primeiro, defina uma classe de atributo personalizada chamada Author
que herde da Attribute
classe:
[AttributeUsage(AttributeTargets.Class)]
class Author : Attribute
{
public string Name
{
get; set;
}
public Author(string name)
{
Name = name;
}
}
Linguagem de código: C# ( cs )
A Author
classe possui uma Name
propriedade e um construtor que recebe um name
parâmetro.
Além disso, decoramos a Author
classe com o [AttributeUsage(AttributeTargets.Class)]
atributo, que especifica que o atributo Autor só pode ser aplicado a classes.
Segundo, defina uma Person
classe e use o Author
atributo para decorá-la:
[Author("John Doe")]
class Person
{
}
Linguagem de código: C# ( cs )
No Author
atributo, definimos a Name
propriedade como "John Doe"
. Posteriormente, você poderá recuperar essas informações em tempo de execução.
Terceiro, mostre a Name
propriedade do Author
atributo aplicado à Person
classe:
// Get all custom attributes of the Person class
var attributes = Attribute.GetCustomAttributes(typeof(Person));
// Retrieve the author attribute
var author = attributes.OfType<Author>().Single();
Console.WriteLine(author.Name);
Linguagem de código: JavaScript ( javascript )
No Main()
método, usamos o Attribute.GetCustomAttributes
método para recuperar todos os atributos customizados da Person
classe.
Em seguida, usamos o método de extensão OfType
LINQ para filtrar a lista de atributos para obter aquele com o tipo Author
.
Como a Person
classe possui apenas um Author
atributo, usamos o Single
método para recuperá-lo e exibir sua Name
propriedade no console.
Resumo
- Atributos são tags declarativas que você pode aplicar a classes, métodos e propriedades.
- Os atributos fornecem informações adicionais aos elementos de código aos quais se aplicam.
- Atributos usados
System.Attribute
como classe base.