Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Spring4d IList<TObject> in IList<IObject> konvertieren (https://www.delphipraxis.net/190384-spring4d-ilist-tobject-ilist-iobject-konvertieren.html)

Rainer Wolff 29. Sep 2016 11:27

Delphi-Version: 10 Seattle

Spring4d IList<TObject> in IList<IObject> konvertieren
 
Hallo,

meine Frage betrifft die Listen aus dem Spring-Framework:

Wie kann ich eine IList<TMeinObject> zu einer IList<IMeinObjekt> konvertieren (TMeinObject implementiert IMeinObject), also aus einer Liste von konkreten Objekten eine Liste von Interfaces daraus machen?

Die IList<TMeinObject> entsteht aus dem Spring-Persistence-Framework, ist daher beim Laden auf den konkreten Typ angewiesen.

Gruß Rainer

Fritzew 29. Sep 2016 12:37

AW: Spring4d IList<TObject> in IList<IObject> konvertieren
 
Tja ich denke da kommst Du um das kopieren nicht herum also sowas wie

Delphi-Quellcode:
from i := 0 to ilist<Tobject>.count - 1 do
 ilist<interface>.add(ilist<Tobject> as Interface);
**** Aber ****
Das mixen von Object und Interface referenzen ist gefährlich.
Das würde ich nur machen wenn Du 100% sicher bist was Du da tust. Wenn
an irgendeiner Stelle die Objecte freigegeben werden fliegt Dir alles um die Ohren.

Ich wäre da "sehr vorsichtig"
Aber vieleicht meldet sich Stevie ja noch dazu

AndyDF 29. Sep 2016 12:44

AW: Spring4d IList<TObject> in IList<IObject> konvertieren
 
Hatte einen ähnlichen Fall und habe den Code gerade mal auf deine Bedürfnisse anpgepasst. Das müsste funktionieren:
Delphi-Quellcode:
class function TMyConverter.ConvertList<T>(const AInputList: IList<TObject>): IList<T>;
var
  i: Integer;
  OutType: T;
  InterfaceGuid: TGUID;
begin
  Result := TList<T>.Create;

  InterfaceGuid := GetTypeData(TypeInfo(T))^.Guid;

  for i := 0 to AInputList.Count-1 do
  begin
    if Supports(AInputList[i],InterfaceGuid,OutType) then
      Result.Add(OutType);
  end;
end;
Ist aber schon ein kleiner Hack. ;) Als "T" sollte natürlich dann wirklich auch nur ein Interface angegeben werden.

Aufruf dann so:

Delphi-Quellcode:
MyInterfaceList := TMyConverter.ConvertList<IMeinObject>(MeineObjectList);


Aber wie bereits erwähnt: Aufpassen wenn sowohl Object als auch Interface Referenzen verwendet werden.


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