Erhalten des Unit-Namens, der zu einem beliebigen Typ gehört (TRttiType)

Ich muss den Namen der Einheit (Namespace) einesTRttiType.

Bis jetzt habe ich Folgendes versucht.

1) mit demPTypeData.UnitName, diese Lösung funktioniert jedoch nur, wenn TTypeKind tkClass ist.

procedure ListAllUnits;
var
  ctx  : TRttiContext;
  lType: TRttiType;
  Units: TStrings;
begin
  Units:=TStringList.Create;
  try
    ctx := TRttiContext.Create;
    for lType in ctx.GetTypes do
     if lType.IsInstance then //only works for classes
      if Units.IndexOf(UTF8ToString(GetTypeData(lType.Handle).UnitName))<0 then
      Units.Add(UTF8ToString(GetTypeData(lType.Handle).UnitName));
  Writeln(Units.Text);
  finally
    Units.Free;
  end;
end;

2) Analysieren desQualifiedNameEigenschaft, Diese Lösung funktioniert bis jetzt in Ordnung, aber ich bin nicht sehr zufrieden damit.

procedure ListAllUnits2;

  function GetUnitName(lType: TRttiType): string;
  begin
    Result := StringReplace(lType.QualifiedName, '.' + lType.Name, '',[rfReplaceAll])
  end;

var
  ctx: TRttiContext;
  lType: TRttiType;
  Units: TStrings;
begin
  Units := TStringList.Create;
  try
    ctx := TRttiContext.Create;
    for lType in ctx.GetTypes do
      if Units.IndexOf(GetUnitName(lType)) < 0 then
        Units.Add(GetUnitName(lType));
    Writeln(Units.Text);
  finally
    Units.Free;
  end;
end;

die Frage ist, gibt es einen anderen zuverlässigen Weg, um den Gerätenamen eines @ zu erhaltTRttiType?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage