Классы-атрибуты могут иметь позиционные и именованные параметры. Каждый открытый экземплярный конструктор класса определяет допустимую последовательность позиционных параметров для данного класса-атрибута. Каждое открытое экземплярное свойство доступное для чтения-записи определяет именованный параметр для данного класса-атрибута.
Значения позиционных параметров указываются в том порядке, в каком они определены в соответствующем конструкторе. Позиционные параметры являются обязательными.
Значения именованных параметров указываются в виде комбинации <Наименование параметра> := <значение>. Именованные параметры указываются после всех позиционных и являются не обязательными.
Типы параметров классов-атрибутов ограничены следующими возможными типами параметров атрибутов:
Один из следующих типов: Boolean, Byte, Char, Double, Float, Integer, Long, Sbyte, Short, String, UInteger, Ulong, Ushort.
Тип Object.
Тип System.Type.
Перечислимый тип, который имеет открытый доступ.
Одномерные массивы элементов перечисленных выше типов.
Ниже приведен пример определения пользовательского класса-атрибута. Для атрибута указываются два параметра. Значения параметров хранятся в свойствах Status и AdditionalValue. В классе TestAttribute для методов задан пользовательский атрибут с различными значениями параметров.
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 UserAttribute;
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;
См.также: