![]() |
Delphi-Version: XE2
Generics: Ungültige Typumwandlung
Hallo zusammen.
Mir machen mal wieder die Generics Kopfschmerzen. Ich möchte in einer Settings-Klasse eine generische get-Funktion haben, die mir den gewünschten Typ direkt castet. Das ganze sollte meiner Meinung nach so aussehen:
Delphi-Quellcode:
Das ganze wollte ich dann z.B. so aufrufen:// Nur als Hinweis: FValues = TDictionary<string, Variant>; { ...} function TSettings.GetItem<T>(Key: String): T; begin Result := T(FValues[Key]); end;
Delphi-Quellcode:
Leider bekomme ich als Fehler:
var
a: TMeineKlasse; i: Integer; begin a := Settings.GetItem<TMeineKlase>('blabla'); i := Settings.GetItem<Integer>('neZahl'); // usw.
Code:
bei meinem cast. Warum geht das nicht und was müsste ich denn ändern?
Ungültige Typumwandlung
|
AW: Generics: Ungültige Typumwandlung
Das hat nichts mit den Genercis zu tun sondern damit das du einen Variant versuchst auf eine Objektinstanz zu casten.
|
AW: Generics: Ungültige Typumwandlung
Zitat:
In deinem Fall solltest du zu Rtti.TValue greifen. Das ist der Container, der alles aufnehmen kann, was es so gibt (und nein, Variant kann das nicht).
Delphi-Quellcode:
Ein Wort der Warnung an dieser Stelle: Im Gegensatz zu Variant, bei welchem einige implizite Typenkonvertierungen durchgeführt werden, wirft TValue.AsType<T> eine EInvalidCast Exception, wenn das was drin steht, nicht direkt zuweisungskompatibel zu T ist.
FValues = TDictionary<string, TValue>;
function TSettings.GetItem<T>(Key: string): T; begin Result := FValues[Key].AsType<T>; end; |
AW: Generics: Ungültige Typumwandlung
Das mit
Delphi-Quellcode:
kannte ich noch nicht. Das klingt deutlich sinniger als Variant. Ich werde das versuchen, danke
TValue
|
AW: Generics: Ungültige Typumwandlung
Okay, sieht für die Abfrage ganz gut aus. Aber ich darf jetzt keine Werte mehr in das Dictionary einfüllen
Delphi-Quellcode:
Data.Add('key', IrgendeinVariant);
Code:
Edit: Habs gefunden.
[DCC Fehler] DataQueries.pas(56): E2010 Inkompatible Typen: 'TValue' und 'Variant'
Delphi-Quellcode:
Quelle:
Data.Add('key', TValue.From<Variant>(Inhalt));
![]() |
AW: Generics: Ungültige Typumwandlung
Andere Möglichkeit wäre,
Delphi-Quellcode:
zu benutzen, dann wird nämlich der Datentyp benutzt, der intern im Variant steckt.
TValue.FromVariant
Vorteil: Wenn du im Variant nen string stehen hast, wird nicht der Variant, in dem der string steht im TValue gespeichert, sondern der string. Nachteil: Wie im vorherigen Post erwähnt, geht dir eventuell notwendige implizite Typenkonvertierung verloren Generell kann ich empfehlen, auf Variants zu verzichten, sofern du einen generischen Ansatz verfolgst. Benutze an Stellen, wo du zur Compiletime den Type nicht kennst, lieber TValue, um Werte auszutauschen. An allen anderen Stellen, benutze den konkreten Datentyp. TValue verfügt für die meisten Standardtypen über überladene Implicit Operatoren, die dir den Aufruf von z.B.
Delphi-Quellcode:
ersparen.
TValue.From<Integer>(i)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:44 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