Hinweise zu Typen und Membern hinzufügen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Attribute (RTTI)


Dieses Thema beschreibt die Syntax und die Regeln für die Annotation von Typen oder Membern mithilfe von Attributen.

Allgemeine Syntax

Um einen Delphi-Typ oder Member, wie z. B. eine Klasse oder einen Klassen-Member, mit einer Annotation zu versehen, müssen Sie der Deklaration dieses Typs den Namen der Attributklasse in eckigen Klammern voranstellen:

[CustomAttribute]
TMyClass = class;

Wenn der Name der Attributklasse mit "Attribute" endet, können Sie das Suffix "Attribute" auch weglassen:

[Custom]
procedure DoSomething;

Die Verwendung von runden Klammern nach dem Attributklassennamen stellt ebenfalls eine gültige Syntax dar:

[Custom()]
TMyRecord = record;

Einige Attribute akzeptieren Parameter. Um an Ihr Attribut Argumente zu übergeben, verwenden Sie dieselbe Syntax wie für Methodenaufrufe:

[Custom(Argument1, Argument2, )]
TSimpleType = set of (stOne, stTwo, stThree);

Um eine Annotation für einen einzeln Typ mit mehreren Attributen durchzuführen, können Sie entweder mehrere eckige Klammern verwenden:

[Custom1]
[Custom2(MyArgument)]
FString: String;

Oder durch Komma getrennte Attribute zwischen einem einzelnen Paar eckiger Klammern verwenden:

[Custom1, Custom2(MyArgument)]
function IsReady: Boolean;

Konstante Ausdrücke können nur als Attributparameter verwendet werden

Ein Attribut, das als Annotation für einen Typ oder einen Member dient, wird in den RTTI-Informationsblock in die erzeugte Bibliothek eingefügt. Die ausgegebenen Informationen umfassen:

  • Den Klassentyp des Attributs.
  • Den Zeiger auf den ausgewählten Konstruktor.
  • Eine Liste von Konstanten, die später an den Attributkonstruktor übergeben werden.

Die an den Konstruktor des Attributs übergebenen Werte müssen konstante Ausdrücke sein. Da diese Werte direkt in die resultierende Binärdatei eingebettet werden müssen, ist es nicht möglich, einen Ausdruck zu übergeben, der zur Laufzeit ausgewertet wird. Daraus ergeben sich einige Beschränkungen hinsichtlich der Informationen, die an das Attribut zur Compilierzeit übergeben werden können:

  • Es sind nur konstante Ausdrücke zulässig, einschließlich Mengen, Strings und ordinale Ausdrücke.
  • Sie können mit TypeInfo() Typinformationen übergeben, weil der RTTI-Blockadressen zur Compilierzeit bekannt sind.
  • Sie können Klassenreferenzen verwenden, weil die Metaklassenadressen zur Compilierzeit bekannt sind.
  • Sie können die Parameter out oder var nicht verwenden, weil für diese eine Auswertung der Adressen der übergebenen Parameter zur Laufzeit erforderlich ist.
  • Sie können Addr() oder @ nicht verwenden.

Der folgende Code zeigt ein Beispiel, in dem der Compiler die Annotation nicht compiliert:

var
    a, b: Integer;
type
    [SomeAttribute(a + b)]
    TSomeType = record
    // …
    end;

Im obigen Beispiel erfordert der Konstruktor von SomeAttribute einen Integerwert. Für den übergebenen Ausdruck ist eine Laufzeitauswertung von a + b erforderlich. Der Compiler gibt einen Compilierfehler aus, weil er einen konstanten Ausdruck erwartet.

Der folgende Code zeigt einen akzeptierten Ausdruck:

const
    a = 10;
    b = 20;
type
    [SomeAttribute(a + b)]
    TSomeType = record
    // …
    end;

Die Werte von a und b sind zur Compilierzeit bekannt; daher wird der konstante Ausdruck direkt ausgewertet.

Siehe auch