Els atributs en C# són una manera poderosa de agregar metadades al teu codi. Aquestes metadades poden ser utilitzades per modificar el comportament del codi en temps d'execució o per proporcionar informació addicional que pot ser utilitzada per altres eines i biblioteques.
Què són els Atributs?
Els atributs són classes que deriven de la classe base System.Attribute
. Es poden aplicar a diverses entitats del codi, com ara classes, mètodes, propietats, camps, etc. Els atributs proporcionen una manera de decorar el codi amb informació addicional que pot ser utilitzada en temps d'execució mitjançant la reflexió.
Exemples d'Atributs Predefinits
C# proporciona diversos atributs predefinits que es poden utilitzar directament. Alguns exemples comuns són:
[Obsolete]
: Marca un element del codi com obsolet.[Serializable]
: Indica que una classe pot ser serialitzada.[DllImport]
: Utilitzat per importar funcions de biblioteques dinàmiques no gestionades.
Creació d'Atributs Personalitzats
Pots crear els teus propis atributs personalitzats per proporcionar metadades específiques per a la teva aplicació. A continuació es mostra com crear un atribut personalitzat:
using System; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class InfoAttribute : Attribute { public string Author { get; } public string Version { get; } public InfoAttribute(string author, string version) { Author = author; Version = version; } }
Explicació del Codi
AttributeUsage
: Aquest atribut especifica els elements del codi als quals es pot aplicar el nostre atribut personalitzat. En aquest cas, es pot aplicar a classes i mètodes.InfoAttribute
: Aquesta és la nostra classe d'atribut personalitzat. Té dues propietats,Author
iVersion
, que es poden utilitzar per proporcionar informació sobre l'autor i la versió del codi.
Aplicació d'Atributs
Un cop creat l'atribut personalitzat, es pot aplicar a classes, mètodes, etc. A continuació es mostra un exemple d'aplicació:
[Info("John Doe", "1.0")] public class SampleClass { [Info("Jane Doe", "1.1")] public void SampleMethod() { Console.WriteLine("Aquest és un mètode de mostra."); } }
Explicació del Codi
[Info("John Doe", "1.0")]
: Aquest atribut s'aplica a la classeSampleClass
i proporciona informació sobre l'autor i la versió.[Info("Jane Doe", "1.1")]
: Aquest atribut s'aplica al mètodeSampleMethod
i proporciona informació diferent sobre l'autor i la versió.
Accés als Atributs en Temps d'Execució
Pots accedir als atributs aplicats al codi mitjançant la reflexió. A continuació es mostra com accedir als atributs en temps d'execució:
using System; using System.Reflection; public class Program { public static void Main() { Type type = typeof(SampleClass); object[] classAttributes = type.GetCustomAttributes(typeof(InfoAttribute), false); foreach (InfoAttribute attr in classAttributes) { Console.WriteLine($"Class Author: {attr.Author}, Version: {attr.Version}"); } MethodInfo method = type.GetMethod("SampleMethod"); object[] methodAttributes = method.GetCustomAttributes(typeof(InfoAttribute), false); foreach (InfoAttribute attr in methodAttributes) { Console.WriteLine($"Method Author: {attr.Author}, Version: {attr.Version}"); } } }
Explicació del Codi
GetCustomAttributes
: Aquest mètode s'utilitza per obtenir els atributs aplicats a una classe o mètode.typeof(SampleClass)
: Obtenim el tipus de la classeSampleClass
.type.GetMethod("SampleMethod")
: Obtenim la informació del mètodeSampleMethod
.
Exercici Pràctic
Enunciat
- Crea un atribut personalitzat anomenat
DocumentationAttribute
que tingui les propietatsDescription
iDate
. - Aplica aquest atribut a una classe i a un mètode dins d'aquesta classe.
- Escriu un programa que accedeixi i mostri les propietats de l'atribut en temps d'execució.
Solució
using System; using System.Reflection; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class DocumentationAttribute : Attribute { public string Description { get; } public string Date { get; } public DocumentationAttribute(string description, string date) { Description = description; Date = date; } } [Documentation("Aquesta és una classe de mostra.", "01/01/2023")] public class ExampleClass { [Documentation("Aquest és un mètode de mostra.", "02/01/2023")] public void ExampleMethod() { Console.WriteLine("Executant ExampleMethod."); } } public class Program { public static void Main() { Type type = typeof(ExampleClass); object[] classAttributes = type.GetCustomAttributes(typeof(DocumentationAttribute), false); foreach (DocumentationAttribute attr in classAttributes) { Console.WriteLine($"Class Description: {attr.Description}, Date: {attr.Date}"); } MethodInfo method = type.GetMethod("ExampleMethod"); object[] methodAttributes = method.GetCustomAttributes(typeof(DocumentationAttribute), false); foreach (DocumentationAttribute attr in methodAttributes) { Console.WriteLine($"Method Description: {attr.Description}, Date: {attr.Date}"); } } }
Explicació del Codi
DocumentationAttribute
: Atribut personalitzat amb les propietatsDescription
iDate
.ExampleClass
iExampleMethod
: Classe i mètode decorats amb l'atributDocumentationAttribute
.Program.Main()
: Programa que accedeix i mostra les propietats de l'atribut en temps d'execució.
Conclusió
Els atributs en C# són una eina poderosa per agregar metadades al teu codi. Pots utilitzar atributs predefinits o crear els teus propis atributs personalitzats per proporcionar informació addicional que pot ser utilitzada en temps d'execució. La reflexió permet accedir a aquests atributs i utilitzar la informació que proporcionen per modificar el comportament del teu codi o per altres finalitats.
Curs de Programació en C#
Mòdul 1: Introducció al C#
- Introducció al C#
- Configuració de l'Entorn de Desenvolupament
- Programa Hello World
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
Mòdul 2: Estructures de Control
Mòdul 3: Programació Orientada a Objectes
Mòdul 4: Conceptes Avançats de C#
- Interfícies
- Delegats i Esdeveniments
- Genèrics
- Col·leccions
- LINQ (Consulta Integrada al Llenguatge)
- Programació Asíncrona
Mòdul 5: Treballant amb Dades
Mòdul 6: Temes Avançats
- Reflexió
- Atributs
- Programació Dinàmica
- Gestió de Memòria i Recollida d'Escombraries
- Multifil i Programació Paral·lela
Mòdul 7: Construcció d'Aplicacions
Mòdul 8: Millors Pràctiques i Patrons de Disseny
- Estàndards de Codificació i Millors Pràctiques
- Patrons de Disseny
- Proves Unitàries
- Revisió de Codi i Refactorització