![]() |
Delphi-Version: 2010
RTTI Typ ermitteln bei generics?
Hallo zusammen,
wie kann ich mit RTTI den Ursprungstyp eines generischen Types/Records ermitteln?
Delphi-Quellcode:
Wie kann ich mittels RTTI prüfen, ob SpecialRecord vom Typ TMyRecord ist?
type
TMyRecord<T> =record private FMySpecialType: T; public property MySpecialType: T read FMySpecialType; end; TSpecialType= class(TObject); var SpecialRecord= TMyRecord<TSpecialClass>; Gruss Clemens |
AW: RTTI Typ ermitteln bei generics?
Den Typ "TMyRecord" gibt es nicht.
Jeder Typ, welcher über TMyRecord<...> erstellt wird, stellt einen eigenständigen Typen dar. PS: Records kennen keine Vererbung SpecialRecord kann und muß also immer vom Typ TMyRecord<TSpecialClass> sein. Es sei denn du manipulierst den dahinterligenden Speicherbereich, unter umgehung aller Sicherheitsmaßnahmen, aber dann ist eh alles egal, da man sowas nicht bestimmen/auslesen kann ... egal was für Bytes in dem Speicher rumliegen es sind und bleiben irgendwelche Bytes und man kann nicht bestimmen daß diese Bytes irgendwas bestimmtes darstellen sollen. |
AW: RTTI Typ ermitteln bei generics?
Sorry, das ist mir auch klar, aber:
über RTTI kann ich einen beliebigen Typ abfragen. Nun will ich wissen, ob mein Typ einer bestimmten Deklaration folgt. bisher mache ich das so:
Delphi-Quellcode:
Funktioniert soweit, wollte nur wissen, ob's nicht auch eleganter geht?!
...
tkRecord: if AnsiStartsText('TMyRecord', FieldInfo.FieldType.AsRecord.Name) then; //aha!! ist TMyRecord ... |
AW: RTTI Typ ermitteln bei generics?
Zitat:
@EDIT, bin mir beim 2ten mal drüber lesen aber nicht mehr ganz sicher :( |
AW: RTTI Typ ermitteln bei generics?
OK, das ist ein bissl anders:
Delphi-Quellcode:
Aber Ansonsten haben Records nunmal keine Vererbung,
type TSpecialRecord = TMyRecord<TSpecialClass>;
var SpecialRecord: TSpecialRecord; if FieldInfo.FieldType.AsRecord.Handle = TypeInfo(TSpecialRecord) then // oder if FieldInfo.FieldType.Handle = TypeInfo(TSpecialRecord) then und demnach haben TMyRecord<> und TMyRecord<irgendwas> keine Verbindung. Allerdings ist die RTTI ja die letzen Jährchen etwas gewachsen, vielleicht bieten die neuen RTTI-Klassen ja irgendwo Zugriff auf eine neue Information, bezüglich dieser Generics. [edit]
Delphi-Quellcode:
type
TGenRec<T> = record x, y: T; end; TRec = TGenRec<Integer>; procedure TForm5.FormCreate(Sender: TObject); var y: TRttiContext; x: TRttiType; begin y := TRttiContext.Create; x := y.GetType(TypeInfo(TRec)); if X.AsRecord.Handle = TypeInfo(TRec) then Beep; if X.Handle = TypeInfo(TRec) then Beep; end; Zitat:
|
AW: RTTI Typ ermitteln bei generics?
Delphi-Quellcode:
und genau das funktioniert nicht, da der Compiler einen TSpecialRecord<T> erwartet.
type
TSpecialRecord = TMyRecord<TSpecialClass>; var SpecialRecord: TSpecialRecord; if FieldInfo.FieldType.AsRecord.Handle = TypeInfo(TSpecialRecord) then // oder if FieldInfo.FieldType.Handle = TypeInfo(TSpecialRecord) then Sieht so aus als bliebe es bei meiner Variante... |
AW: RTTI Typ ermitteln bei generics?
Zitat:
![]() ![]() |
AW: RTTI Typ ermitteln bei generics?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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-2025 by Thomas Breitkreuz