Отправляет email-рассылки с помощью сервиса Sendsay

Финансы. Инструкция

  Все выпуски  

Уроки по C# и .NET.


Информационный Канал Subscribe.Ru

C# и .NET. Уроки с сайта http://progs.biz

Рассылка №21

Основы C#. Урок 36. Пример пользовательского атрибута.

Полные версии уроков (с картинками) можно найти по адресам
Урок 36. Пример пользовательского атрибута.

Основы C#. Урок 36. Пример пользовательского атрибута.

Вот пример определения и использования пользовательского атрибута:

using System;
namespace test
{
    //Объявление атрибута.
    [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
    class TestAttribute: System.Attribute
    {
        //Поле атрибута.
        private string name;
        //Конструктор атрибута.
        public TestAttribute(string name)
        {
            this.name = name;
        }
        //Свойство только для чтения.
        public virtual string Name
        {
            get
            {
                return name;
            }
        }
    }
    //Конец объявления атрибута.
    //Применение атрибута к классу.
    [TestAttribute("Igor Alexeev")]
    class Test
    {
        static void Main()
        {
            GetAttribute(typeof(Test));
        }
        public static void GetAttribute(Type t)
        {
            TestAttribute att=
                (TestAttribute) Attribute.GetCustomAttribute(t, typeof(TestAttribute));
            Console.WriteLine("{0}", att.Name);
        }
    }
}

Как видно, атрибут TestAttribute является потомком класса System.Attribute (как всегда). Перед определением нового атрибута мы видим строку

...
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
 ...

Этой строкой определяется область применения нашего атрибута - первый параметр (AttributeTargets.All) говорит о том, что мы сможем применять наш атрибут TestAttribute к чему угодно, второй (Inherited=false) - что атрибут не будет наследоваться (т. е. если мы применим атрибут TestAttribute к некоторому классу, то у потомков этого класса атрибута TestAttribute не будет), третий (AllowMultiple = true) - что атрибут к каждому элементу может пременяться только один раз (заметим в скобках, что для определения области применения нашего пользовательского атрибута мы используем другой атрибут - AttributeUsage).

Далее мы определяем для нашего атрибута внутреннюю переменную name типа string и конструктор с параметром типа string. В конструкторе мы записываем значение в переменную name. Еще чуть ниже мы пишем в классе атрибута свойство только для чтения:

        ...
        public virtual string Name
        {
            get
            {
                return name;
            }
        }
        ...

После создания класса атрибута мы применяем его к другому классу Test. Для этого мы должны создать экземпляр атрибута TestAttribute непосредственно перед классом Test:

    ...
    [TestAttribute("Igor Alexeev")]
    class Test
    {
    ...

Делаем мы это в квадратных скобках. При этом у нас вызывается конструктор с параметром атрибута.

В классе Test мы в методе GetAttribute просто выводим на консоль значение свойства name атрибута. Для этого мы воспользовались статическим методом GetCustomAttribute класса Attribute. Этот метод принимает в качестве параметров тип, к которому атрибут применяется (т. е. класс Test в нашем случае) и собственно атрибут, который мы применяем (у нас это TestAttribute). Возвращает же он экземпляр атрибута, который мы и используем для получения значения свойства name.

Метод GetAttribute мы вызываем в констукторе класса Test.

Результатом выполнения нашей программы будет вывод на консоль слов "Igor Alexeev".

Наверх

Рассылки с сайта progs.biz

Рассылки Subscribe.Ru
Уроки по C/C++

Уроки по C/C++. Конструкции языка, указатели, объектно-ориентированное программирование, работа с файлами, библиотека STL и другое.


Copyright Алексеев Игорь, 2003

Copyright сайт progs.biz, 2003



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное