![]() |
Generic ToString?
Ist ein Generic ToString möglich?
Beispiel:
Delphi-Quellcode:
Wie würde ToString zu implementieren sein?
Type
TMyVar<T> = Class Value: T; function ToString: String End;
Delphi-Quellcode:
geht leider nicht und prüfen mit "Is" geht nicht immer.
Result := Value.ToString
|
AW: Generic ToString?
Nein, .ToString() wird nicht von allen Typen unterstützt und kann deshalb so nicht vorausgesetzt werden.
|
AW: Generic ToString?
Du könntest vielleicht deinen Typ auf einen Wrapper einschränken, beispielsweise
Delphi-Quellcode:
System.Rtti.TValue
|
AW: Generic ToString?
|
AW: Generic ToString?
Wieso überladen? Er will doch an der Signatur nichts ändern.
Dass er das override vergisst müsste ja auch in seinen Warnungen stehen ;-) |
AW: Generic ToString?
Zitat:
|
AW: Generic ToString?
ja, war mal wieder zu "theoretisch" momentan sieht das so aus:
Delphi-Quellcode:
function ToString: TStringList; reintroduce;
und die Abfragen erfolgen so:
Delphi-Quellcode:
function TMyVar<T>.ToString: TStringList;
begin Result := TStringList.Create; if ClassName.Contains('Integer') Then ConvIntegerToSL(Result) else if ClassName.Contains('TMyClass') then .. usw. end; |
AW: Generic ToString?
Aua, da kannst du dir aber schöne Speicherlecks mit erstellen :)
Und diese BasisMethode so zu vergewaltigen ist auch nicht ratsam. Dafür würde ich eine eigene Methode einführen
Delphi-Quellcode:
obwohl ich da eher zu
ToStrings : TStrings
Delphi-Quellcode:
tendieren würde, da gibt es keine Lecks.
TArray<string>
Mit
Delphi-Quellcode:
kann man auch eine Menge erschlagen
TValue.From<T>.AsString
|
AW: Generic ToString?
Zitat:
Das mit TValue krieg ich aber irgendwie nicht hin, ich hab eine rekursiv aufgerufene Methode die wie folgt aussieht:
Delphi-Quellcode:
weiter hinten wird dann über das interne fVarArr iteriert und im anschluß der fToStrBuffer-String der Stringliste
procedure TWrapVariable<T>.DoConvertToString(const Lvl: Integer; const x: TVariable<T>; const ALst: TStringList);
var i: Integer; iVi: TVariable<Integer>; iVf: TVariable<Single>; iVs: TVariable<AnsiString>; iVb: TVariable<Boolean>; s: String; begin if Length(x.FVarArr)=0 then begin if (fVarType = gicInteger) then begin x.AsVariable(iVi); s:= TValue.From<TVariable<T>>(x).AsString; // comiled zwar wirft aber eine EInvalidCast fToStrBuffer := fToStrBuffer + Format('%d,', [iVi.FValue]); end else if (fVarType = gicFloat) then begin x.AsVariable(iVf); fToStrBuffer := fToStrBuffer + Format('%1.5f,', [iVf.FValue]); end .... end; for i := Low(x.FVarArr) to High(x.FVarArr) do begin DoConvertToString(Lvl+1, x.FVarArr[i] As TVariable<T>, ALst); end; if (Length(x.FVarArr) <> 0) Or (Lvl=0) then begin ALst.Add(fToStrBuffer); fToStrBuffer := ''; end; end; hinzugefügt. |
AW: Generic ToString?
Zitat:
Delphi-Quellcode:
bitte. AsString wird dich anspringen, wenn T irgendwas nicht string zuweisungskompatibles ist. So wie alle TValue.AsXXX Methoden.
ToString
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 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 by Thomas Breitkreuz