Kako raditi s atributima u C #

Atributi su moćna značajka u programskom jeziku C # koja može dodati podatke o metapodacima u vaše sklopove.

Atribut je zapravo objekt koji je povezan s bilo kojim od ovih elemenata: Skupštinom, Klasom, Metodom, Delegatom, Enumom, Događajem, Poljem, Sučeljem, Svojstvom i Strukturom. Mogu se koristiti za pridruživanje deklarativnih podataka - takve podatke možete dohvatiti tijekom izvođenja kasnije, ako je potrebno pomoću refleksije. Drugim riječima, atribute možete koristiti za ubrizgavanje dodatnih informacija u sklopove koji se mogu zatražiti tijekom izvođenja ako je potrebno pomoću refleksije. Atribut se sastoji od svog imena i po želji popisa parametara. Naziv atributa odgovara klasi atributa.

Atribute možete iskoristiti za provjeru valjanosti poslovnih objekata u vašoj aplikaciji. Postoje dvije vrste atributa - unutarnji atributi i prilagođeni atributi. Iako je prva dostupna kao dio .Net okvira, druga se može implementirati izvođenjem klase iz klase System.Attribute. MSDN kaže: "Atribut je dodatni deklarativni podatak koji je naveden za deklaraciju."

Uđimo sada u neki kod. Zastarjeli atribut može se označiti kao zastarjela metoda - ona koja se više ne bi smjela koristiti jer više nije potrebna ili može imati neku drugu alternativu. Sljedeći isječak koda ilustrira kako možete koristiti zastarjeli atribut na vrhu deklaracije metode.

[Obsolete("This method is obsolete...")]

        public static void DoSomeWork()

        {

            //Some code

        }

Ako koristite ovu metodu u svom kodu i kompajlirate svoj program, vidjet ćete upozorenje prikazano u izlaznom prozoru Visual Studio IDE-a. Dakle, možete zanemariti ovo upozorenje ako želite. Što ako želite da programeri uopće ne koriste ovu metodu? Pa, tada možete upotrijebiti drugi parametar (iako je neobavezan) dok deklarirate zastarjeli atribut. Evo izmijenjene verzije metode DoSomeWork (). Ovaj put primijetite upotrebu logičkog parametra.

[Obsolete("This method is obsolete...", true)]

        public static void DoSomeWork()

        {

                       //Some code

        }                                                                                                                        

Kad ovaj put dodate "true" kao drugi neobavezni parametar i prevedete svoj program, kod se uopće neće prevesti. To ste htjeli učiniti, zar ne?

Prilagođeni atributi

U ovom ćemo odjeljku istražiti kako možemo implementirati prilagođene atribute. Prilagođeni atributi su klase koje nasljeđuju klasu System.Attribute. Dakle, da biste implementirali prilagođenu klasu atributa, stvorite novu klasu i izvedite je iz klase System.Attribute kako je prikazano u nastavku.

using System;

public class CustomAttribute : Attribute

{

}

Da biste kontrolirali upotrebu prilagođenih atributa, možete iskoristiti klasu AttributeUsage. Ova klasa sadrži svojstva poput ValidOn, AllowMultiple i Inherited koja se mogu koristiti za kontrolu upotrebe vašeg prilagođenog atributa.

Sljedeći isječak koda ilustrira modificiranu verziju naše klase prilagođenih atributa. Obratite pažnju na upotrebu konstruktora koji prihvaća niz kao argument i dodjeljuje ga privatnom članu niza klase. Ovo je samo radi ilustracije.

[AttributeUsage(AttributeTargets.All)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

Također možete odrediti ciljeve atributa na koje bi se vaš prilagođeni atribut trebao primijeniti. Evo kako to možete učiniti.

[AttributeUsage(AttributeTargets.Class |

AttributeTargets.Constructor |

AttributeTargets.Field |

AttributeTargets.Method |

AttributeTargets.Property,

AllowMultiple = true)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

Sada pomoću odsjaja možete prikazati sve atribute koji su primijenjeni na određeni objekt pomoću sljedećeg isječka koda.

MemberInfo memberInfo = typeof(CustomAttribute);

object[] attributes = memberInfo.GetCustomAttributes(true);

for (int i = 0, j = attributes.Length; i < j; i++)

  {

     Console.WriteLine(attributes[i]);

  }

Sada razmotrite sljedeću klasu na koju bismo primijenili naš prilagođeni atribut.

[CustomAttribute("Hello World...")]

public class SomeClass

{

}

Obratite pažnju na to kako je korišten prilagođeni atribut i tekst mu je proslijeđen kao argument. Sljedeći isječak koda ilustrira kako možete ispisati sadržaj svojstva Text.

MemberInfo memberInfo = typeof(SomeClass);

object[] attributes = memberInfo.GetCustomAttributes(true);

foreach (object attribute in attributes)

{

CustomAttribute customAttribute = attribute as CustomAttribute;

if (customAttribute != null)

Console.WriteLine("Text = {0}", customAttribute.Text);

else

Console.WriteLine();

}