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:
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;
Implementiert:
Delphi-Quellcode:
{ 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;
Wenn ich dies nun teste:
Delphi-Quellcode:
procedure TForm10.FormCreate(Sender: TObject);
var
str : TNullableString;
jv : TJSONValue;
begin
str := 'Test';
jv := str.getJSONValue;
self.Caption := jv.ToJSON;
end;
stelle ich fest, dass immer in den Helper TNullableBooleanHelper gesprungen wird, statt in den TNullableStringHelper, wie ich es erwarten würde.
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:
Nullable<T> = record
[...]
Darauf bauen die anderen Typen auf:
Delphi-Quellcode:
TNullableString = Nullable<string>;
TNullableBoolean = Nullable<Boolean>;
Kann mir jemand helfen?
Danke!
Jens