Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Casten nach etwas generischem (https://www.delphipraxis.net/200902-casten-nach-etwas-generischem.html)

Der schöne Günther 5. Jun 2019 13:18

Delphi-Version: 5

Casten nach etwas generischem
 
Angenommen ich habe

Delphi-Quellcode:
   uses System.Rtti;

   TVirtualInterfaceEx = class(TVirtualInterface)
      class function Construct<T: IInterface>(..): T;
   end;
mit

Delphi-Quellcode:
class function TVirtualInterfaceEx.Construct<T>(...): T;
var
   virtualInterface: TVirtualInterface;
begin
   virtualInterface := TVirtualInterface.Create( TypeInfo(T) );
   Result := (virtualInterface as T); // "Error E2015"
   (...);
end;
Der Compiler mag das "as T" nicht, obwohl T eigentlich auf IInterface eingeschränkt ist.
Delphi-Quellcode:
System.SysUtils.Supports(..)
hat das gleiche Problem.

Gibt es hier eine Lösung? Kann ich eine Instanz auf "T" casten wenn T ein IInterface ist?

Der schöne Günther 5. Jun 2019 13:45

AW: Casten nach etwas generischem
 
Ich habe eine Lösung gefunden und sie war einfacher als gedacht. Man kommt relativ einfach an die TGUID des Interfaces und das kann man dann für Supports(..) verwenden:

Delphi-Quellcode:
   guid := GetTypeData( TypeInfo(T)).Guid;
   Supports(virtualInterface, guid, Result);

Mavarik 5. Jun 2019 15:06

AW: Casten nach etwas generischem
 
Das war jetzt aber nur für Interfaces gültig..

Neutral General 5. Jun 2019 16:19

AW: Casten nach etwas generischem
 
für Klassen geht einfach ein harter cast T(objekt)

peterbelow 5. Jun 2019 18:42

AW: Casten nach etwas generischem
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1433979)
Ich habe eine Lösung gefunden und sie war einfacher als gedacht. Man kommt relativ einfach an die TGUID des Interfaces und das kann man dann für Supports(..) verwenden:

Delphi-Quellcode:
   guid := GetTypeData( TypeInfo(T)).Guid;
   Supports(virtualInterface, guid, Result);


Dir ist schon klar das Interfaces nicht unbedingt eine GUID haben müssen, oder?

Der schöne Günther 5. Jun 2019 18:53

AW: Casten nach etwas generischem
 
Ja, aber in meinem Fall ist das unerheblich. In diesem Fall bekommt man eine leere GUID zurück. Ich brauchte nur dass meine Methode eine gültige Interface-Referenz ausspuckt und das tut sie über Supports(..) lustigerweise sogar wenn man eine leere GUID reinsteckt. 😎

Stevie 6. Jun 2019 12:00

AW: Casten nach etwas generischem
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1434004)
lustigerweise sogar wenn man eine leere GUID reinsteckt. 😎

Ja, aber auch nur weil TVirtualInterface.QueryInterface die angefragte GUID mit der des virtuell implementierten Interfaces vergleicht, wenn die beide leer sind, ist der Vergleich auch True.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf