Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [RTTI] Reservierte Wörter bei Attributen? (https://www.delphipraxis.net/162734-%5Brtti%5D-reservierte-woerter-bei-attributen.html)

mquadrat 3. Sep 2011 08:29

Delphi-Version: 5

[RTTI] Reservierte Wörter bei Attributen?
 
Guten Morgen zusammen,

Ich grübel gerade über einem kleinen ORM-Mapper, der die Mappings aus Attributen bezieht. Gibt es irgendwo eine Liste reservierter Wörter, die man nicht als Attribute verwenden darf? Hintergrund ist der Versuch ein Attribut "Field" zu definieren. Das endet in der vielsagenden Meldung "':' erwartet aber '(' gefunden". Nenne ich das Attribut "xyField" erfolgt keine Fehlermeldung und alles ist gut.

Die RTTI Hilfe ist da etwas spärlich ;)

s.h.a.r.k 3. Sep 2011 11:06

AW: [RTTI] Reservierte Wörter bei Attributen?
 
Wenn du aber FieldAttribute verwendest, dann klappt es :thumb: (Ich weiß, ist mehr zu schreiben, aber immerhin)

himitsu 3. Sep 2011 11:32

AW: [RTTI] Reservierte Wörter bei Attributen?
 
'ne Liste kenn ich och noch nicht, aber

z.B. das geht alle nicht: var const type field and procedure class of function property ...
und keine Ahnung, warum die überhaupt nicht genutzt werden können :gruebel:

Da sind zwar viele FETTE reservierte Wörter bei, aber wer jetzt denkt alle Reservierte gehen nicht, dann ... z.B. private und read kann man doch verwenden


Was passiert, wenn du einfach den Doppelpunkt schreibst?
Delphi-Quellcode:
[ field: ]
läßt sich zumindestens kompilieren :angle2:

s.h.a.r.k 3. Sep 2011 12:27

AW: [RTTI] Reservierte Wörter bei Attributen?
 
Zitat:

Zitat von himitsu (Beitrag 1121474)
Da sind zwar viele FETTE reservierte Wörter bei, aber wer jetzt denkt alle Reservierte gehen nicht, dann ... z.B. private und read kann man doch verwenden

Aber sowas tut doch weh, oder? :wall: Naja... man muss echt nicht alles verstehen, was andere verbocken :lol:

mquadrat 5. Sep 2011 09:22

AW: [RTTI] Reservierte Wörter bei Attributen?
 
Na das verwirrende ist ja, dass ich ohne Probleme eine Klasse "Field" anlegen kann. Der Fehler taucht erst beim Attribut auf. Da werden die [] wohl scheinbar nicht sauber erkannt, oder aber es war mal vorgesehen, dass es in [] mehr als bloß das Attribut geben kann. Oder ich stehe grad noch auf dem Schlauch :-D

Elvis 5. Sep 2011 10:49

AW: [RTTI] Reservierte Wörter bei Attributen?
 
Habe gerade damti gespielt (D2010) und kam zum Schluss, dass man Attribute in Delphi nur super-vorsichtig mit einer ganz langen Zange anfassen darf.

Ich würde sie nicht nutzen, schon gar nicht für etwas so kritisches wie einen ORM, da machsu dir lieber eine eigene DSL (mit ANTLR) oder denkst dir ein XML-Format aus.

Hier meine Versuche, zwischendurch gab's wohl mehr sinnlose Fehler als keine und Error-Insight hatte, wie immer, Null Einsicht.
Wenn du also einen ORM schaffst, der Attribute unterstützt/benötigt, brauchen seine User eine sehr dicke Hornhaut.

Delphi-Quellcode:
program AttributesTest;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Rtti;

type
  FieldAttribute = class(TCustomAttribute)
  private
    fMappedName: String;
  public
    property MappedName : String read fMappedName write fMappedName;
    constructor Create; overload;
    constructor Create(mappedName : String); overload;
  end;

constructor FieldAttribute.Create(mappedName: String);
begin
  fMappedName := mappedName;
end;

constructor FieldAttribute.Create();
begin
end;

type
  SampleClass = class
  private
    fMiep: String;
    fMööp: String;
  published
    // [FieldAttribute(MappedName='A')] [DCC Fatal Error] AttributesTest.dpr(42): F2084 Internal Error: TI2180
    [FieldAttribute('A')] // Workaround: 2. Ctor mit parameter :-/
    property Miep :String read fMiep write fMiep;
    //[&Field] geht nich! o_O
    //[Field:] kompiliert o_O t, macht aber nix...
    //[@Field] kompiliert o_O t, macht aber nix...
    [FieldAttribute] // WOrkaround: Voller Name mit Attribute-Suffix :-/
    property Mööp :String read fMööp write fMööp;
  end;

 var
  rttiContext    : TRttiContext;
  propInfo       : TRttiProperty;
  mappedFieldName : String;
  function GetMappedFieldName(propInfo : TRttiProperty) : String;
  var
    attr : TCustomAttribute;
  begin
    for attr in propInfo.GetAttributes() do
      if attr is FieldAttribute then
      begin
        if FieldAttribute(attr).MappedName <> '' then
          exit (FieldAttribute(attr).MappedName);

        exit (propInfo.Name);
      end;
    exit ('');
  end;

begin
  try
    rttiContext := TRttiContext.Create();
    try
      for propInfo in rttiContext.GetType(SampleClass).GetDeclaredProperties() do
      begin
        mappedFieldName := GetMappedFieldName(propInfo);
        if mappedFieldName <> '' then
          Writeln(propInfo.Name, ' -> ', mappedFieldName);
      end;
    finally
      rttiContext.Free();
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz