![]() |
Delphi-Version: 5
Record Helper für generische Records (Spring)
Moin,
ich setze das Spring-Framework ein, insbesondere daraus die Nullable-Typen. Nun wollte ich für diese Typen Record Helper basteln. Das compiliert auch korrekt. Jedoch wird bei der Codeausführung ein falscher Recordhelper verwendet (die Ausführung springt in den falschen Helper). Codebeispiel:
Delphi-Quellcode:
Implementiert:
uses
[...] Spring, System.JSON; type TNullableStringHelper = record helper for TNullableString public function getJSONValue : TJSONValue; end; TNullableBooleanHelper = record helper for TNullableBoolean public function getJSONValue : TJSONValue; end;
Delphi-Quellcode:
Wenn ich dies nun teste:
{ TNullableStringHelper }
function TNullableStringHelper.getJSONValue: TJSONValue; begin if self.HasValue then result := TJSONString.Create(self.GetValueOrDefault) else result := TJSONNull.Create; end; { TNullableBooleanHelper } function TNullableBooleanHelper.getJSONValue: TJSONValue; begin if self.HasValue then if self.GetValueOrDefault then result := TJSONTrue.Create else result := TJSONFalse.Create else result := TJSONNull.Create; end;
Delphi-Quellcode:
stelle ich fest, dass immer in den Helper TNullableBooleanHelper gesprungen wird, statt in den TNullableStringHelper, wie ich es erwarten würde.
procedure TForm10.FormCreate(Sender: TObject);
var str : TNullableString; jv : TJSONValue; begin str := 'Test'; jv := str.getJSONValue; self.Caption := jv.ToJSON; end; Ich kann mir das Verhalten so gar nicht erklären. In der Caption des Formulars steht nach Ausführung "True" und nicht "Test" wie ich es erwarten würde. Es ist also nicht nur ein Problem des Debuggers, sondern wird tatsächlich so ausführt. Für die, die das Spring-Framework nicht kennen, die Nullable-Typen sehen so aus: Es gibt den Record Nullable:
Delphi-Quellcode:
Darauf bauen die anderen Typen auf:
Nullable<T> = record
[...]
Delphi-Quellcode:
Kann mir jemand helfen?
TNullableString = Nullable<string>;
TNullableBoolean = Nullable<Boolean>; Danke! Jens |
AW: Record Helper für generische Records (Spring)
Ich kann es gerade nicht ausprobieren, aber versuch mal folgende Definitionen vor deine Helper zu setzen
Delphi-Quellcode:
TNullableString = type Spring.TNullableString;
TNullableBoolean = type Spring.TNullableBoolean; |
AW: Record Helper für generische Records (Spring)
Das lässt sich leider nicht kompilieren:
Delphi-Quellcode:
[dcc32 Fehler] Unit10.pas(10): E2574 Instantiierter Typ kann nicht für TYPE-Typdeklaration verwendet werden
|
AW: Record Helper für generische Records (Spring)
Das macht ja auch keinen Sinn, denn
Delphi-Quellcode:
ist sein eigener Typ (warum eigentlich?) und nicht aus Spring.
TNullableString
Interessant ist auch, dass schon die IDE selbst mit STRG+Klick auf
Delphi-Quellcode:
in den letzten Helper springt!
ToJSON()
Ob das mit der Operator-Überladung für
Delphi-Quellcode:
bei
Implicit
Delphi-Quellcode:
zu tun hat?
Nullable<>
|
AW: Record Helper für generische Records (Spring)
Zitat:
Dann sehe ich im Moment keine Möglichkeit da raus zu kommen. Da Records nicht abgeleitet werden können und Helper auf generische Typen sich nicht nach Typen unterscheiden lassen, sieht das schlecht aus für deinen Ansatz. |
AW: Record Helper für generische Records (Spring)
Zitat:
Delphi-Quellcode:
wird mit
NullableHelper = record helper for Nullable<T>
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 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