Benutzerdefinierte Attribute deklarieren (RTTI)
Nach oben zu Attribute - Index
Dieses Thema beschreibt die grundlegenden Methoden zum Erstellen von benutzerdefinierten Attributen, die korrekten Designentscheidungen für Attributklassen und deren allgemeine Verwendung.
Deklarieren eines Attributs
Ein Attribut ist ein einfacher Klassentyp. Um ein eigenes benutzerdefiniertes Attribut zu erstellen, müssen Sie es von einer bestimmten, vordefinierten Klasse TCustomAttribute ableiten, die sich in der Unit System befindet:
type TMyCustomAttribute = class(TCustomAttribute) end;
Mit TMyCustomAttribute können dann beliebige Typen oder Member eines Typs (wie z.B. Klasse, Record oder Interface) mit Annotationen versehen werden:
type [TMyCustomAttribute] TSpecialInteger = type integer;
oder
type
TSomeClass = class
[TMyCustomAttribute]
procedure Work;
end;
Beachten Sie bitte, dass die deklarierte Attributklasse nicht als class abstract deklariert werden darf und keine abstrakten Methoden enthalten sollte. Obwohl der Compiler die Verwendung dieser Attribute für die Annotation zulässt, enthält die erzeugte Binärdatei diese Attribute nicht in den ausgegebenen RTTI-Informationen.
Konstruktoren in Attributen
In der Regel sollen Attribute zusätzliche Informationen enthalten, die zur Laufzeit abgefragt werden können. Damit benutzerdefinierte Informationen für die Attributklasse festgelegt werden können, müssen Sie Konstruktoren dafür deklarieren:
type
TAttrWithConstructor = class(TCustomAttribute)
public
constructor Create(const ASomeText: String);
end;
Die dann folgendermaßen verwendet werden können:
type
[TAttrWithConstructor('Added text value!')]
TRecord = record
FField: Integer;
end;
Die Methodenauflösung wird auch für Attribute angewendet. Das bedeutet, dass Sie überladene Konstruktoren in dem benutzerdefinierten Attribut definieren können. Deklarieren Sie nur Konstruktoren, die konstante Werte akzeptieren und keine out- oder var-Werte. Das liegt an einer grundlegenden Einschränkung bei der Funktionsweise von Attributen und wird unter Hinweise zu Typen und Membern hinzufügen detailliert erläutert.