C# - Attribútumok felhasználási lehetőségei

forráskód letöltése
Függvényeinkhez, property-jeinkhez megadhatunk attribútumokat. Ezekkel sok mindent vezérelhetünk, beállíthatunk. Lehetőségünk van viszont arra is, hogy saját, egyedi attribútumot készítsünk és használjunk, sőt arra is, hogy ezek értékét program futási ideje alatt kiolvassuk.
Megadhatunk például egy olyan attribútumot, mellyel azt tudathatjuk a fordítóval, hogy küldjön a programozónak egy figyelmezetést arról, hogy egy olyan függvényt használ fel az egyik osztályunkból, mely már elavult és csak kompatibilitási okokból hagytuk benne.
Ekkor kell az Obsolete attribútumot megadni a függvényünk előtt. Paraméterként megadhatunk egy egyedi üzenetet is, mely megjelenik fordításkor a figyelmeztetés mellett.
  public class Class1
  {
    [Obsolete("Ez a függvény elavult, ne használd!")]
    public static int Add(int a, int b)
    {
      return a + b;
    }
  }
Ha saját attribútumot használnánk, akkor ehhez először létre kell hozni egy osztályt, mely az Attribute osztályból származik. Használjuk ezt az új attribútumot mondjuk arra, hogy megadhassuk benne annak nevét, aki utoljára módosította a forráskódunk egy bizonyos részét, valamint a módosítás időpontját.
  [AttributeUsage(AttributeTargets.All)]
  public class LastChangeAttribute: System.Attribute 
  {
    private string name;
    private DateTime dt;
Az osztály konstruktorát ennek megfelelően alakítjuk ki, így ott átadható e két szükséges paraméter.
Ezeket a paramétereket az osztályuk privát változóiba tároljuk el.
    public LastChangeAttribute(string name, string dt)
    {
      this.name = name;
      this.dt = DateTime.Parse(dt); 
    }
Ezen felül lehetőséget biztosítunk arra, hogy e két érték két property-n keresztül kiolvasható legyen.
    public string Name
    {
      get { return name; }      
    }
    public DateTime DateTime
    {
      get { return dt; }
    }
  }
Nézzük most ezek felhasználását a Form1.cs-ben.
Próbáljuk meg az elavult függvényt felhasználni.
Ez sikerül, sőt programunk is fut így, hiszen csak egy figyelmeztető üzenetet küld a fordító az alábbi sorra és nem hibát.
    private void button1_Click(object sender, System.EventArgs e)
    {
      label1.Text = Class1.Add(5, 5).ToString();
    }
A saját attribútum létrehozását ki is próbálhatjuk, például a Form1 osztályhoz rendelve egy LastChange attribútumot. Ennek paramétereként átadunk egy nevet és egy időpontot.
...
namespace AttributeTest
{
  [LastChange("Software Online", "2001. 01. 01. 15:30")]
  public class Form1 : System.Windows.Forms.Form
...
Ezt a két adatot programból a következő módszerrel tudjuk kiolvasni.
    private void button2_Click(object sender, System.EventArgs e)
    {      
Az Attribute osztály GetCustomAttribute függvényét felhasználva lekérünk egy objektumot, mely az imént megadott LastChange attribútumot tartalmazza. Ehhez paraméterként a kérdéses Form1 típusát, valamint az attribútum típusát kell megadnunk.
      LastChangeAttribute attr = (LastChangeAttribute)Attribute.GetCustomAttribute(typeof(Form1), typeof(LastChangeAttribute));         
Ha a visszaadott objektum nem null, akkor sikeres volt a lekérdezés.
      if (attr != null)
      {
Ebben az esetben a két property-n keresztül már igen egyszerűen elérhető a két szükséges adat.
        label2.Text = attr.Name + " - " + attr.DateTime.ToString();
      }
    }