csharp-atributos

Cómo usar atributos en C#

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.