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
- Definición de Atributos: Los atributos son clases que derivan de
System.Attribute
. - Aplicación de Atributos: Se aplican utilizando corchetes
[]
antes de la declaración del elemento al que se aplican. - Atributos Predefinidos: C# proporciona varios atributos predefinidos como
[Obsolete]
,[Serializable]
,[DllImport]
, etc. - 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
- Crea un atributo personalizado llamado
VersionAttribute
que tenga propiedades paraNumeroVersion
yFecha
. - Aplica este atributo a una clase y a uno de sus métodos.
- 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#.
Curso de Programación en C#
Módulo 1: Introducción a C#
- Introducción a C#
- Configuración del Entorno de Desarrollo
- Programa Hola Mundo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
Módulo 2: Estructuras de Control
Módulo 3: Programación Orientada a Objetos
- Clases y Objetos
- Métodos
- Constructores y Destructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Conceptos Avanzados de C#
- Interfaces
- Delegados y Eventos
- Genéricos
- Colecciones
- LINQ (Consulta Integrada en el Lenguaje)
- Programación Asíncrona
Módulo 5: Trabajando con Datos
Módulo 6: Temas Avanzados
- Reflexión
- Atributos
- Programación Dinámica
- Gestión de Memoria y Recolección de Basura
- Multihilo y Programación Paralela
Módulo 7: Construcción de Aplicaciones
Módulo 8: Mejores Prácticas y Patrones de Diseño
- Estándares de Codificación y Mejores Prácticas
- Patrones de Diseño
- Pruebas Unitarias
- Revisión y Refactorización de Código