![]() |
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 ;) |
AW: [RTTI] Reservierte Wörter bei Attributen?
Wenn du aber FieldAttribute verwendest, dann klappt es :thumb: (Ich weiß, ist mehr zu schreiben, aber immerhin)
|
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:
läßt sich zumindestens kompilieren :angle2:
[ field: ]
|
AW: [RTTI] Reservierte Wörter bei Attributen?
Zitat:
|
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
|
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 10:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz