Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Generische Listen (https://www.delphipraxis.net/164810-generische-listen.html)

daywalker9 30. Nov 2011 15:53

Delphi-Version: 5

Generische Listen
 
Ich bin gerade dabei, mir eine Klasse zu schreiben, die Daten serialisiert und in eine XML speichert und auch wieder laden kann.

Nun stellt sich die Frage, wenn ich eine TObjectList<T> übergebe, kommt ich an den Typen von T ran, damit ich die richtigen Klassen instanzieren kann?

Stevie 30. Nov 2011 16:00

AW: Generische Listen
 
Da Delphi keine Covarianz unterstützt geht hier nur der Hardcast auf TObjectList<TObject> und/oder das ermitteln des Typs von T mithilfe von Typnamen parsen und RTTI.

Dazu kannst du dir anschauen, wie ich das gemacht habe (die Methoden von TRttiTypeHelper)

Jens01 30. Nov 2011 16:06

AW: Generische Listen
 
Meinst Du sowas?
Delphi-Quellcode:
GetTypeData(TypeInfo(T)).ClassType = TIrgendwas

daywalker9 30. Nov 2011 16:11

AW: Generische Listen
 
Das ja TypeInfo von der Liste und nicht die, von dem Typen T der in der TObjecList enthalten ist.

Stevie 30. Nov 2011 16:39

AW: Generische Listen
 
Andere Alternative, die mir gerade noch einfällt, wäre sowas:

Delphi-Quellcode:
type
  TMySerializer = class
    procedure SerializeList<T: class>(List: TList<T>);
    procedure DeserializeList<T: class, constructor>(List: TList<T>);

procedure TMySerializer.DeserializeList<T>(List: TList<T>);
var
  newItem: T;
begin
  ...
  newItem := T.Create;
  Self.DeserializeObject(newItem);
  List.Add(newItem);
  ...
end;

daywalker9 30. Nov 2011 16:41

AW: Generische Listen
 
Ah, Idee ist gut, mal schauen.

Danke Stevie!

webcss 30. Nov 2011 18:35

AW: Generische Listen
 
Also, Du kannst Dir natürlich auch mit folgender function behelfen, solange Dein Typ T eine einfache Klasse ist:

Delphi-Quellcode:
function GetGenericType(const AName: string): TRTTIType;

   function ExtractQualifiedName(const AName: string):string;
   var i: integer;
   begin
     i:= succ(pos('<', AName));
     Result:= copy(AName, i, pos('>', AName)-i);
   end;

var lCTX: TRTTIContext;
begin
  Result:= lCTX.FindType(ExtractQualifiedName(AName));
end;
Ist zwar 'ne Krücke, funktioniert aber prima in D2010!

daywalker9 30. Nov 2011 18:46

AW: Generische Listen
 
Hatte ich auch schon ausprobiert, nur bekomme ich nicht alle Typen zurück.

Stevies Gedanken habe ich nun mittlerweile zu Papier gebracht ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 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