Introducción

En C#, los atributos son una poderosa característica que permite agregar metadatos a tu código. Estos metadatos pueden ser utilizados por el compilador, herramientas de desarrollo, o en tiempo de ejecución para modificar el comportamiento del programa. Los atributos se aplican a casi cualquier elemento del código, como clases, métodos, propiedades, etc.

Conceptos Clave

  1. Definición de Atributos: Los atributos son clases que derivan de System.Attribute.
  2. Aplicación de Atributos: Se aplican utilizando corchetes [] antes de la declaración del elemento al que se aplican.
  3. Atributos Predefinidos: C# proporciona varios atributos predefinidos como [Obsolete], [Serializable], [DllImport], etc.
  4. Atributos Personalizados: Puedes crear tus propios atributos personalizados para necesidades específicas.

Ejemplo Práctico

Atributos Predefinidos

[Obsolete]

El atributo [Obsolete] se utiliza para marcar elementos del código que están obsoletos y no deberían ser utilizados.

using System;

public class Program
{
    [Obsolete("Este método está obsoleto. Usa NuevoMetodo en su lugar.")]
    public static void MetodoAntiguo()
    {
        Console.WriteLine("Método antiguo");
    }

    public static void NuevoMetodo()
    {
        Console.WriteLine("Nuevo método");
    }

    public static void Main()
    {
        MetodoAntiguo(); // Genera una advertencia
        NuevoMetodo();
    }
}

Atributos Personalizados

Creación de un Atributo Personalizado

using System;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class InformacionAutorAttribute : Attribute
{
    public string Nombre { get; }
    public string Fecha { get; }

    public InformacionAutorAttribute(string nombre, string fecha)
    {
        Nombre = nombre;
        Fecha = fecha;
    }
}

Aplicación del Atributo Personalizado

[InformacionAutor("Juan Pérez", "01/01/2023")]
public class MiClase
{
    [InformacionAutor("Ana Gómez", "02/02/2023")]
    public void MiMetodo()
    {
        Console.WriteLine("Método en MiClase");
    }
}

Lectura de Atributos en Tiempo de Ejecución

Para leer los atributos en tiempo de ejecución, se utiliza la reflexión.

using System;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        Type tipo = typeof(MiClase);
        object[] atributosClase = tipo.GetCustomAttributes(typeof(InformacionAutorAttribute), false);

        foreach (InformacionAutorAttribute atributo in atributosClase)
        {
            Console.WriteLine($"Clase {tipo.Name} - Autor: {atributo.Nombre}, Fecha: {atributo.Fecha}");
        }

        MethodInfo metodo = tipo.GetMethod("MiMetodo");
        object[] atributosMetodo = metodo.GetCustomAttributes(typeof(InformacionAutorAttribute), false);

        foreach (InformacionAutorAttribute atributo in atributosMetodo)
        {
            Console.WriteLine($"Método {metodo.Name} - Autor: {atributo.Nombre}, Fecha: {atributo.Fecha}");
        }
    }
}

Ejercicio Práctico

Ejercicio

  1. Crea un atributo personalizado llamado VersionAttribute que tenga propiedades para NumeroVersion y Fecha.
  2. Aplica este atributo a una clase y a uno de sus métodos.
  3. Escribe un programa que lea y muestre estos atributos en tiempo de ejecución.

Solución

Creación del Atributo Personalizado

using System;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class VersionAttribute : Attribute
{
    public string NumeroVersion { get; }
    public string Fecha { get; }

    public VersionAttribute(string numeroVersion, string fecha)
    {
        NumeroVersion = numeroVersion;
        Fecha = fecha;
    }
}

Aplicación del Atributo

[Version("1.0", "01/01/2023")]
public class MiClaseVersionada
{
    [Version("1.1", "02/02/2023")]
    public void MetodoVersionado()
    {
        Console.WriteLine("Método versionado");
    }
}

Lectura de Atributos en Tiempo de Ejecución

using System;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        Type tipo = typeof(MiClaseVersionada);
        object[] atributosClase = tipo.GetCustomAttributes(typeof(VersionAttribute), false);

        foreach (VersionAttribute atributo in atributosClase)
        {
            Console.WriteLine($"Clase {tipo.Name} - Versión: {atributo.NumeroVersion}, Fecha: {atribro.Fecha}");
        }

        MethodInfo metodo = tipo.GetMethod("MetodoVersionado");
        object[] atributosMetodo = metodo.GetCustomAttributes(typeof(VersionAttribute), false);

        foreach (VersionAttribute atributo in atributosMetodo)
        {
            Console.WriteLine($"Método {metodo.Name} - Versión: {atributo.NumeroVersion}, Fecha: {atributo.Fecha}");
        }
    }
}

Conclusión

En esta sección, hemos aprendido sobre los atributos en C#, cómo se definen, aplican y leen en tiempo de ejecución. Los atributos son una herramienta poderosa para agregar metadatos a tu código y pueden ser utilizados para una variedad de propósitos, desde la documentación hasta la modificación del comportamiento del programa en tiempo de ejecución. En el siguiente tema, exploraremos la programación dinámica en C#.

© Copyright 2024. Todos los derechos reservados