![]() |
Delphi-Version: 5
Casten nach etwas generischem
Angenommen ich habe
Delphi-Quellcode:
mit
uses System.Rtti;
TVirtualInterfaceEx = class(TVirtualInterface) class function Construct<T: IInterface>(..): T; end;
Delphi-Quellcode:
Der Compiler mag das "as T" nicht, obwohl T eigentlich auf IInterface eingeschränkt ist.
class function TVirtualInterfaceEx.Construct<T>(...): T;
var virtualInterface: TVirtualInterface; begin virtualInterface := TVirtualInterface.Create( TypeInfo(T) ); Result := (virtualInterface as T); // "Error E2015" (...); end;
Delphi-Quellcode:
hat das gleiche Problem.
System.SysUtils.Supports(..)
Gibt es hier eine Lösung? Kann ich eine Instanz auf "T" casten wenn T ein IInterface ist? |
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); |
AW: Casten nach etwas generischem
Das war jetzt aber nur für Interfaces gültig..
|
AW: Casten nach etwas generischem
für Klassen geht einfach ein harter cast T(objekt)
|
AW: Casten nach etwas generischem
Zitat:
Dir ist schon klar das Interfaces nicht unbedingt eine GUID haben müssen, oder? |
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. 😎
|
AW: Casten nach etwas generischem
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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