Anzeigen: Delphi C++
Anzeigeeinstellungen

Benutzerdefinierte Attribute deklarieren (RTTI)

Aus RAD Studio
Wechseln zu: Navigation, Suche

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.

Siehe auch

In anderen Sprachen