3

を使用してオブジェクトを取得しようとしていますTRttiContext.FindType(QualifiedTypeName)。これが私が持っているものです:

program MissingRTTI;
{$APPTYPE CONSOLE}
uses System.SysUtils, RTTI, Classes;
type
  TMyClass = class(TObject) end;
var
  rCtx:   TRttiContext;
  rType:  TRttiInstanceType;
begin
  rCtx := TRttiContext.Create();
  rType := rCtx.GetType(TypeInfo(TMyClass)) as TRttiInstanceType;
  if (rType <> nil) then begin
    WriteLn('Type found using TypeInfo');
  end;
  rType := rCtx.FindType(TMyClass.QualifiedClassName) as TRttiInstanceType;
  if (rType <> nil) then begin
    WriteLn('Type found using qualified class name.');
  end;
  ReadLn;
  rCtx.Free();
end.

残念ながら、rCtx.GetType目的のタイプしか見つからないようです。(GetTypesを使用してすべての型を一覧表示しようとしました。目的の型が結果の配列に表示されません。)コンパイラにこの型のRTTIを強制的に発行させる方法を知っている人はいますか?

4

1 に答える 1

7

この関数のため、メソッドを呼び出してもFindTypeRtti情報は返されません works only for public types。したがって、rType.IsPublicTypeプロパティを確認すると、返される値はfalseです。

パブリックタイプは、ユニットのインターフェイスセクションで宣言する必要があります(パブリックとして認識されるため)。したがって、TMyClassクラス定義をユニットのインターフェイス部分に移動すると、FindType問題なく使用できるようになります。

于 2012-05-15T20:41:07.900 に答える