Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

RTTI: Wie kann ich prüfen, ob ein Feld vom Typ einer Klasse ist?

  Alt 24. Apr 2014, 12:56
Delphi-Version: XE5
Und ich dachte, ich könnte mit der RTTI umgehen.

Folgendes:
Delphi-Quellcode:
type
   TBaseClass = class(TObject);
   TSubClass = class(TBaseClass);

   TMyContainer = class
      first: TBaseClass;
      second: TSubClass;
      third: TObject;
   end;
Ich möchte alle Felder in TMyContainer finden, die zuweisungskompatibel zu TBaseClass sind. Also first und second .

Wie tue ich das? Mir fällt nichts anderes ein, als nur strikt Typ mit Typ vergleichen zu können.

Folgengender Code
Delphi-Quellcode:
var
   context: TRttiContext;
   fieldIterator: TRttiField;

begin
   context := TRttiContext.Create();

   for fieldIterator in context.GetType(TMyContainer).GetFields() do begin
      WriteLn( 'Feld gefunden: '+fieldIterator.Name.QuotedString() );

      if fieldIterator.FieldType = context.GetType(TBaseClass) then
         WriteLn('Das Feld ist eine zu TBaseClass kompatible Instanz');

      if Assigned(fieldIterator.FieldType.BaseType) then
         WriteLn('BaseType-Name: '+fieldIterator.FieldType.BaseType.Name);

      WriteLn(EmptyStr);
   end;

   ReadLn;
end.
ergibt
Code:
Feld gefunden: 'first'
Das Feld ist eine zu TBaseClass kompatible Instanz
BaseType-Name: TObject

Feld gefunden: 'second'
BaseType-Name: TBaseClass

Feld gefunden: 'third'
Man sieht:
  • TBaseClass leitet sich ab von TObject
  • TSubClass leitet sich ab von TBaseClass
  • TObject leitet sich von nichts ab

Nur: Muss ich jetzt für jedes Feld die gesamte Vererbungshierarchie bis TObject hochkrabbeln um zu schauen, ob meine gewollte Basisklasse einmal vorkommt?

Frage: Gibt es in der RTTI nichts wie das normale InheritsFrom(..) bzw. den is -Operator?
  Mit Zitat antworten Zitat