AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record Helper für generische Records (Spring)

Ein Thema von Nersgatt · begonnen am 23. Okt 2014 · letzter Beitrag vom 23. Okt 2014
Antwort Antwort
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, 10: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
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#2

AW: Record Helper für generische Records (Spring)

  Alt 23. Okt 2014, 10:53
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

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

AW: Record Helper für generische Records (Spring)

  Alt 23. Okt 2014, 10:58
Das lässt sich leider nicht kompilieren:
[dcc32 Fehler] Unit10.pas(10): E2574 Instantiierter Typ kann nicht für TYPE-Typdeklaration verwendet werden
Jens
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Record Helper für generische Records (Spring)

  Alt 23. Okt 2014, 11:10
Das macht ja auch keinen Sinn, denn TNullableString ist sein eigener Typ (warum eigentlich?) und nicht aus Spring.

Interessant ist auch, dass schon die IDE selbst mit STRG+Klick auf ToJSON() in den letzten Helper springt!

Ob das mit der Operator-Überladung für Implicit bei Nullable<> zu tun hat?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#5

AW: Record Helper für generische Records (Spring)

  Alt 23. Okt 2014, 11:14
Das lässt sich leider nicht kompilieren:
[dcc32 Fehler] Unit10.pas(10): E2574 Instantiierter Typ kann nicht für TYPE-Typdeklaration verwendet werden
Recht haste!

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

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

AW: Record Helper für generische Records (Spring)

  Alt 23. Okt 2014, 11:30
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.
Ich hatte auch versucht, direkt einen Helper für Nullable<T> zu schreiben. Aber da hab ich so gar keinen Ansatz gefunden.
NullableHelper = record helper for Nullable<T> wird mit
Zitat:
[dcc32 Fehler] Unit10.pas(10): E2003 Undeklarierter Bezeichner: 'T'
quittiert.
Jens
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz