Меню сайта
Категории раздела
HTML [44] |
Visual C++ и MFC [21] |
c++ [78] |
php [19] |
Javascript [15] |
C# [51] |
загрузки [0] |
XNA
[10]
создание игр с помощью xna
|
Наш опрос
Друзья сайта
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Главная » Статьи » 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". | |
Просмотров: 557 | Рейтинг: 0.0/0 |
Всего комментариев: 0 | |