![]() |
Delphi-Version: 12 Athens
Wie kann ich Generics an overloaded Methode weitergeben
"Add" ist überladen und kann von diversen Typen sein...
Gibt es eine hoffnung das dieser code irgendwie funktioniert oder muss ich für jeden Typ ne Kopie von dem code machen?
Delphi-Quellcode:
Unit MUELL;
Interface uses System.IOUtils, System.Classes, System.Variants, System.sysutils, System.Generics.Collections,uBasetableAccess, strutils, system.types,System.JSON, System.JSONConsts, System.JSON.Writers, System.JSON.Readers, REST.JSON; type TJSONfn = class public class Function ArrToJSON<T>(const aArr:TArray<T>):String; //Generics können scheinbar nur in Methoden aber nicht in Prozeduren verwendet werden... also bitte schön Delphi, eine Klasse mit Methode end; Implementation class Function TJSONfn.ArrToJSON<T>(const aArr:TArray<T>):String; Begin var JSArr := TJSONArray.Create; try For var element:T in aArr do JSArr.Add(element); // <===== an dieser Stelle kapituliert der compiler bedingungslos Result := JSArr.ToJSON finally JSArr.Free; end; End; end. |
AW: Wie kann ich Generics an overloaded Methode weitergeben
Das wird so wohl nichts. Wie soll der Compiler denn wissen von welchen Typ T ist. Sechs Varianten sind erlaubt bei Add.
Da müsste es dann schon eine "function Add(const Element: <T>): TJSONArray" geben. |
AW: Wie kann ich Generics an overloaded Methode weitergeben
Wenn man den Typ "einschränkt", dann compiliert es:
Delphi-Quellcode:
Leider kann man nur auf Klassen, Interfaces und Records einschränken, nicht auf String, Integer etc.
class Function ArrToJSON<T: TJSONArray>(const aArr:TArray<T>):String;
Aber du könntest sowas versuchen (ungetestet):
Delphi-Quellcode:
if TypeInfo(T) = TypeInfo(string) then
JSArr.Add(String(element)) else if TypeInfo(T) = TypeInfo(Double) then JSArr.Add(Double(element)) ... else Raise Exception.Create((PTypeInfo(TypeInfo(T))^.Name + ' not allowes'); |
AW: Wie kann ich Generics an overloaded Methode weitergeben
Zitat:
Ja ich weiß.... Zitat:
Ist ok Ich hoffe einfach mal das ich nie etwas anderes als TArray<String> brauche. Und wenn mal was dazu kommt dann gibts halt overloaded versionen. Ich halte ja eh nichts von DRY. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 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