Атрибуты

Язык 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;

См. также:

Руководство по языку Fore.NET