Ich weiß, ein schöner Test sieht anders aus, aber das gewünschte Ergebnis ist vorhanden
Delphi-Quellcode:
type
TTest = class
strict private type TStrict = class end;
strict private _Strict : TStrict;
private type TOne = class end;
private One : TOne;
protected type TTwo = class end;
protected Two : TTwo;
public type TThree = class end;
public Three : TThree;
public type
TNested = class
public type TNestedNested = class end;
public Nested : TNestedNested;
end;
public Nested : TNested;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
RC : TRttiContext;
RT : TRttiType;
T : TTest;
begin
mmoLog.Clear();
for RT in RC.GetTypes() do
if (Pos(TTest.ClassName, RT.QualifiedName) > 0) then
mmoLog.Lines.Add(RT.QualifiedName);
T := TTest.Create();
T.Free();
end;
// liefert:
Unit1.TTest.TStrict
Unit1.TTest.TOne
Unit1.TTest.TTwo
Unit1.TTest.TThree
Unit1.TTest.TNested.TNestedNested
Unit1.TTest.TNested
Unit1.TTest
Das Problem hierbei ist aber noch herauszufinden, welcher Teil von z.B.
Unit1.TTest.TStrict ein Typ ist und welcher zur
Unit gehört. Idee hierzu: den String nach und nach kürzen und via TRttiContext.FindType testen, ob der Typ gefunden wurde und ob dessen QualifiedName-Eigenschaft gleich dem übergebenen String-Parameter entspricht.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)