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 i Version, 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 classe SampleClass i proporciona informació sobre l'autor i la versió.
  • [Info("Jane Doe", "1.1")]: Aquest atribut s'aplica al mètode SampleMethod 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 classe SampleClass.
  • type.GetMethod("SampleMethod"): Obtenim la informació del mètode SampleMethod.

Exercici Pràctic

Enunciat

  1. Crea un atribut personalitzat anomenat DocumentationAttribute que tingui les propietats Description i Date.
  2. Aplica aquest atribut a una classe i a un mètode dins d'aquesta classe.
  3. 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 propietats Description i Date.
  • ExampleClass i ExampleMethod: Classe i mètode decorats amb l'atribut DocumentationAttribute.
  • 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.

© Copyright 2024. Tots els drets reservats