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?