|
Пример пользовательского атрибута.
Вот пример определения и использования пользовательского атрибута: 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".
Источник: |
Категория: С# | Добавил: Sumrak (14.11.2010)
| Автор: E W
|
Просмотров: 888 | Комментарии: 0
| Теги:
| Рейтинг: 0.0/0 |
|
|
|