Как да работя с атрибути в C #

Атрибутите са мощна функция в езика за програмиране C #, която може да добавя информация за метаданни към вашите сборки.

Атрибутът всъщност е обект, който е свързан с някой от тези елементи: събрание, клас, метод, делегат, преброяване, събитие, поле, интерфейс, свойство и структура. Те могат да се използват за свързване на декларативна информация - можете да извлечете такава информация по време на изпълнение в по-късен момент, ако е необходимо да използвате размисъл. С други думи, можете да използвате атрибути, за да инжектирате допълнителна информация към сглобките, която може да бъде поискана по време на изпълнение, ако е необходимо, като се използва отражение. Атрибутът се състои от името си и по желание списък с параметри. Името на атрибута съответства на класа на атрибута.

Можете да се възползвате от атрибутите, за да проверите бизнес обектите в приложението си. Има два типа атрибути - вътрешни атрибути и персонализирани атрибути. Докато първият е наличен като част от рамката .Net, вторият може да бъде реализиран чрез извличане на клас от класа System.Attribute. MSDN гласи: "Атрибутът е допълнителна декларативна информация, която е посочена за декларация."

Нека сега да влезем в някакъв код. Остарелият атрибут може да се използва, за да обозначи метод като остарял - такъв, който вече не трябва да се използва, тъй като вече не е необходим или може да има друга алтернатива. Следният кодов фрагмент илюстрира как можете да използвате остарелия атрибут върху декларация за метод.

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

        public static void DoSomeWork()

        {

            //Some code

        }

Ако използвате този метод в кода си и компилирате програмата си, ще видите предупреждение, изведено в изходния прозорец на Visual Studio IDE. Така че, можете да игнорирате това предупреждение, ако искате. А сега, ако искате разработчиците ви да не използват този метод изобщо? Е, тогава можете да използвате втория параметър (въпреки това е по избор), докато декларирате остарелия атрибут. Ето модифицираната версия на метода DoSomeWork (). Този път обърнете внимание на използването на булевия параметър.

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

        public static void DoSomeWork()

        {

                       //Some code

        }                                                                                                                        

Когато този път предадете "true" като втори незадължителен параметър и компилирате програмата си, кодът изобщо няма да се компилира. Това сте искали да направите, нали?

Персонализирани атрибути

В този раздел ще разгледаме как можем да приложим персонализирани атрибути. Персонализираните атрибути са класове, които наследяват клас System.Attribute. Така че, за да приложите потребителски клас атрибут, създайте нов клас и го извлечете от клас System.Attribute, както е показано по-долу.

using System;

public class CustomAttribute : Attribute

{

}

За да контролирате използването на персонализирани атрибути, можете да се възползвате от класа AttributeUsage. Този клас съдържа свойства като, ValidOn, AllowMultiple и Inherited, които могат да се използват за контрол на използването на вашия персонализиран атрибут.

Следващият фрагмент от код илюстрира модифицирана версия на нашия потребителски клас атрибут. Обърнете внимание на използването на конструктор, който приема низ като аргумент и го присвоява на частния низ член на класа. Това е само с илюстративна цел.

[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;

            }

        }

    }

Можете също така да посочите целите на атрибутите, към които трябва да бъде приложен вашият персонализиран атрибут. Ето как можете да го направите.

[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;

            }

        }

    }

Вече можете да използвате отражение, за да покажете всички атрибути, които са приложени към определен обект, като използвате следния кодов фрагмент.

MemberInfo memberInfo = typeof(CustomAttribute);

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

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

  {

     Console.WriteLine(attributes[i]);

  }

Сега разгледайте следния клас, към който бихме приложили нашия потребителски атрибут.

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

public class SomeClass

{

}

Обърнете внимание как е бил използван персонализираният атрибут и текст, предаден като аргумент към него. Следният кодов фрагмент илюстрира как можете да отпечатате съдържанието на свойството 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();

}