Los atributos en C# son clases especiales que se utilizan para agregar metadatos a los elementos de código.
Estos metadatos pueden ser leídos y utilizados por el compilador, herramientas de desarrollo o el propio programa en tiempo de ejecución mediante reflexión.
Los atributos se derivan de la clase base System.Attribute
.
Estos metadatos proporcionan información adicional sobre los elementos del programa, como clases, métodos, propiedades, entre otros
Sintaxis de los atributos
Un atributo se declara colocando el nombre del atributo entre corchetes ([ ]
) justo antes de la declaración del elemento al que se aplica. Por ejemplo:
[Serializable]
public class Ejemplo { }
[Obsolete("Este método está obsoleto")]
public void MetodoAntiguo() { }
En estos ejemplos, Serializable
y Obsolete
son atributos que proporcionan información adicional sobre la clase Ejemplo
y el método MetodoAntiguo
, respectivamente.
Uso de atributos predefinidos
Existen muchos atributos predefinidos en el .NET. Vamos a ver algunos de ellos.
Atributo Serializable
El atributo Serializable
se utiliza para indicar que una clase puede ser serializada, lo que significa que sus instancias pueden ser convertidas en un formato que puede ser almacenado o transmitido y luego reconstruido.
[Serializable]
public class Persona
{
public string Nombre { get; set; }
public int Edad { get; set; }
}
En este ejemplo, la clase Persona
está marcada como Serializable
, permitiendo que sus instancias sean serializadas.
Atributo Obsolete
El atributo Obsolete
se utiliza para marcar elementos del código como obsoletos, proporcionando una advertencia o error de compilación cuando se usan.
public class Ejemplo
{
[Obsolete("Usa el método NuevoMetodo en su lugar")]
public void MetodoAntiguo()
{
// Código obsoleto
}
public void NuevoMetodo()
{
// Código nuevo
}
}
Aquí, el método MetodoAntiguo
está marcado con el atributo Obsolete
, indicando que se debe usar NuevoMetodo
en su lugar.
Atributo AttributeUsage
El atributo AttributeUsage
se utiliza para especificar cómo y dónde se puede aplicar un atributo personalizado.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class InfoAttribute : Attribute
{
public string Descripcion { get; }
public InfoAttribute(string descripcion)
{
Descripcion = descripcion;
}
}
En este ejemplo, se define un atributo personalizado InfoAttribute
que puede ser aplicado a clases y métodos, y permite múltiples usos en un mismo elemento.
Definición y uso de atributos personalizados
Además de usar atributos personalizados, también es posible definir atributos personalizados según las necesidades específicas del desarrollador.
Para definir un atributo personalizado, se crea una clase que derive de System.Attribute
y se añade cualquier propiedad o campo necesario.
Definición de un atributo personalizado
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AutorAttribute : Attribute
{
public string Nombre { get; }
public string Fecha { get; }
public AutorAttribute(string nombre, string fecha)
{
Nombre = nombre;
Fecha = fecha;
}
}
En este ejemplo, se define un atributo personalizado AutorAttribute
con dos propiedades: Nombre
y Fecha
.
Uso de un atributo personalizado
[Autor("Luis", "01/06/2023")]
public class Ejemplo
{
[Autor("Luis", "01/06/2023")]
public void MetodoEjemplo()
{
// Código del método
}
}
Aquí, el atributo Autor
se aplica tanto a la clase Ejemplo
como al método MetodoEjemplo
, proporcionando información sobre el autor y la fecha.
Lectura de atributos en tiempo de ejecución
La reflexión en C# permite leer los atributos aplicados a los elementos de código en tiempo de ejecución. Esto se hace utilizando las clases del espacio de nombres System.Reflection
.
Type tipo = typeof(Ejemplo);
foreach (var atributo in tipo.GetCustomAttributes(typeof(AutorAttribute), false))
{
AutorAttribute autor = (AutorAttribute)atributo;
Console.WriteLine($"Clase - Autor: {autor.Nombre}, Fecha: {autor.Fecha}");
}
MethodInfo metodo = tipo.GetMethod("MetodoEjemplo");
foreach (var atributo in metodo.GetCustomAttributes(typeof(AutorAttribute), false))
{
AutorAttribute autor = (AutorAttribute)atributo;
Console.WriteLine($"Método - Autor: {autor.Nombre}, Fecha: {autor.Fecha}");
}
En este ejemplo, se leen y muestran los atributos Autor
aplicados a la clase Ejemplo
y al método MetodoEjemplo
.