![]() |
Den konkreten Typ eines Generics ermitteln
Hallo alle zusammen,
ein kleines Nebenprodukt, das bei der Arbeit an meinem ORM abgefallen ist. Zumindest unter D2010 ist es so, dass man mit den Bordmitteln nicht an den eigentlichen Typ eines Generics herankommt. Bsp.
Delphi-Quellcode:
Leider kann man hier trotz RTTI und Reflection nicht an TMyClass kommen:(
type
TMyList= class(TList<TMyClass>); Mit dieser kleinen Routine ist es aber doch möglich:
Delphi-Quellcode:
Sie liefert einem den TRTTIType des Generics und damit alle Informationen zur Weiterverarbeitung:
function GetConcreteGenericType(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;
Delphi-Quellcode:
Vielleicht ist das ja jemandem nützlich, vielleicht kann man das auch noch verbessern; für mich ists erstmal ausreichend...
...
MyList.Add(GetConcreteGenericType(MyList.ClassName).AsInstance.MetaclassType.Create); Frohe Weihnachten! |
AW: Den konkreten Typ eines Generics ermitteln
Leider kommt man nur an den Namen des Typs und nicht an den Typ selber.
Allerdings können mehrere Typen den selben Namen haben, so daß es über den blosen Namen keine genaue Zuordnung gibt. |
AW: Den konkreten Typ eines Generics ermitteln
Zitat:
bekommst Du den TRTTIType des generischen Items (im Beispiel TMyClass) und damit alle Möglichkeiten, die Dir mit Reflection in TRTTIType für TMyClass zur Verfügung stehen... Was genau passiert: Im VMT steht für jeden generischen Typ der qualifizierte Name(=deklarierende unit.Klasse), z.B. unit1.TList<TMyClass>. Ich lese diese Information und extrahiere TMyClass. Mittels Reflection kann ich nun den TRTTIType für diese Klasse aus der VMT raussuchen... |
AW: Den konkreten Typ eines Generics ermitteln
Delphi-Quellcode:
Liefert nur den unqualifizierten Klassennamen, also was von mehreren gleichnamigen Typen soll denn nun genommen werden?
MyList.ClassName
Delphi-Quellcode:
function GetConcreteGenericType(AClass: TClass): 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 while Assigned(AClass) and (Pos('<', AClass.ClassName) = 0) do AClass := AClass.ClassParent; if Assigned(AClass) then Result := lCTX.FindType(ExtractQualifiedName(AClass.ClassName)) else Result := nil; end; procedure TForm1.FormCreate(Sender: TObject); var TheType: TRTTIType; begin TheType := GetConcreteGenericType(TMyList); if Assigned(TheType) then //ShowMessage(TheType.AsInstance.MetaclassType.ClassName) ShowMessage(TheType.ToString) else ShowMessage('nee, hier gibt''s nix zu sehn'); end; |
AW: Den konkreten Typ eines Generics ermitteln
Alles schön und gut. Bestand nicht aber der Sinn von Generics genau darin, dass man eben nicht wissen muss (will), um welchen Typ es konkret geht :gruebel:
Wenn ich das unbeding unterscheiden will, kann ich ja gleich auf das altbewährte strohdumme für jeden Typ eine eigene Implementation Prinzip zurückgreifen. |
AW: Den konkreten Typ eines Generics ermitteln
Zitat:
Sorry für das missposting, hatte halt nur meinen speziellen Fall (s.o.) im Auge, und da funktioniert es prima... Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 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