Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Typüberprüfung mit generic Interface

  Alt 6. Mai 2014, 23:42
Nur, da ich das hier grade fand
und noch keine Lösung da stand.

Hab selber sowas gebraucht und bastelte mir dabei Folgendes.
Man sieht auch noch schrittweise Ableitung, von dem was mann wollte, bis zu dem, was der Compiler hinbekommt.
Delphi-Quellcode:
uses
  System.SysConst, System.SysUtils;

type
  TMyClass = class
  private
    FIntf: IInterface;
  public
    property Intf: IInterface read FIntf;
    function GetIntf<I: IInterface>: I; inline;
  end;

function TMyClass.GetIntf<I>: I;
begin
  //Result := FIntf as I;

  //if FIntf.QueryInterface(I, Result) <> S_OK then
  // raise EIntfCastError.Create(SIntfCastError);

  if FIntf.QueryInterface(PTypeInfo(TypeInfo(I)).TypeData.Guid, Result) <> S_OK then
    raise EIntfCastError.Create(SIntfCastError);
end;
Die "Typ-Prüfung" wird bereits beim Parsen erledigt und nicht erst bei der Verwendung, somit kann man sowas nicht direkt verwenden,
da der generische Typ, zu dieser dieser Zeit ja noch nicht existiert, bzw. noch nicht bekannt ist.

Auch sowas wie SizeOf(Result) geht da oftmals nicht. (hier eventuell schon, da der Grundtyp des Generics vorgegeben ist)


[edit]
Manchmal kann man es sich auch bissl umständlicher machen. (zum Glück hab ich nicht gleich mit TRttiContext nach dem Vögelchen geworfen)
Delphi-Quellcode:
  if FIntf.QueryInterface(GetTypeData(TypeInfo(I)).Guid, Result) <> S_OK then
    raise EIntfCastError.Create(SIntfCastError);
$2B or not $2B

Geändert von himitsu ( 6. Mai 2014 um 23:53 Uhr)
  Mit Zitat antworten Zitat