Einzelnen Beitrag anzeigen

Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Record Helper für generische Records (Spring)

  Alt 23. Okt 2014, 09:46
Delphi-Version: 5
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
Jens
  Mit Zitat antworten Zitat