Язык Fore.NET позволяет разработчикам указывать в декларативном виде информацию о сущностях, определяемых в программе. Помимо стандартного способа определения информации в виде модификаторов, язык предоставляет новый способ определения декларативной информации, называемый атрибутами. Разработчики могут задавать атрибуты для различных сущностей программы и получать атрибутивную информацию во время выполнения программы. Атрибуты определяются посредством описания классов-атрибутов, которые могут иметь позиционные и именованные параметры:
Каждый открытый экземплярный конструктор класса определяет допустимую последовательность позиционных параметров для данного класса-атрибута;
Каждое открытое экземплярное свойство, доступное для чтения-записи, определяет именованный параметр для данного класса-атрибута.
Допустимые типы параметров атрибутов
Класс, являющийся производным от системного класса System.Attribute (непосредственно или опосредованно), называется классом-атрибутом. Определение класса-атрибута описывает новый вид атрибута, который в дальнейшем будет использоваться для дополнения сущностей информацией. Наименования всех классов-атрибутов заканчиваются суффиксом Attribute.
Примечание. При использовании атрибутов суффикс Attribute может опускаться.
Для указания атрибута для сущности используется конструкция следующего вида: [<Атрибут>(<Значения параметра 1, Значения параметра 2...>)]. Все параметры между собой разделяются запятыми.
Позиционные параметры (если они имеются) идут перед именованными, в том порядке, в каком они определены в конструкторе. Позиционные параметры являются обязательными.
Именованные параметры являются необязательными, их порядок может быть любой. Значения именованных параметров указываются в виде комбинации <Наименование параметра> := <Значение>.
Public Enum UserStatus
None, User, Admin, ISA
End Enum UserStatus;
//Класс-атрибут
Public Class UserAttribute: System.Attribute
User: UserStatus;
s: String;
Public Constructor UserAttribute(Status: UserStatus);
Begin
User := Status;
End Constructor;
Public Property Status: UserStatus
Get
Begin
Return User
End Get
Set
Begin
User := Status;
End Set
End Property;
Public Property AdditionalValue: String
Get
Begin
Return s
End Get
Set
Begin
s := Value;
End Set
End Property;
End Class;
Public Class TestAttribute
//Атрибут с позиционным параметром
[User(UserStatus.User)]
Public Sub UserMethod();
Begin
End Sub;
//Атрибут с позиционным и именованным параметром
[User(UserStatus.Admin, AdditionalValue := "1")]
Public Sub AdminMethod();
Begin
End Sub;
[User(UserStatus.ISA, AdditionalValue := "2")]
Public Sub ISAMethod();
Begin
End Sub;
End Class;
Imports System;
Imports System.Reflection;
Imports System.Diagnostics;
Sub ExtractAttributeInfo();
Var
Obj: TestAttribute = New TestAttribute();
ObjType, UserAttrType: System.Type;
ObjMethodInfo: MethodInfo;
Attr: System.Attribute;
Begin
//Получаем тип объекта
ObjType := Obj.GetType();
//Получаем тип класса-атрибута
UserAttrType := (New UserAttribute(UserStatus.None)).GetType();
//Получаем список методов в классе
For Each ObjMethodInfo In ObjType.GetMethods() Do
//Получаем информацию об атрибутах каждого метода класса
For Each Attr In Attribute.GetCustomAttributes(ObjMethodInfo) Do
If Attr.GetType() = UserAttrType Then
Debug.Write((Attr As UserAttribute).Status);
Debug.WriteLine(" " + (Attr As UserAttribute).AdditionalValue);
End If;
End For;
End For;
End Sub;
См. также: