我正在尝试使用 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 吗?

最佳答案

您对 FindType 方法的调用不会返回 Rtti 信息,因为此函数 works only for public types 。因此,如果您检查 rType.IsPublicType 属性,则返回的值为 false 。

公共(public)类型必须在单元的接口(interface)部分声明(被识别为公共(public))。因此,如果您将 TMyClass 类定义移动到单元的接口(interface)部分,您将能够毫无问题地使用 FindType

关于delphi - 为什么在GetType 成功时FindType 获取RTTI 失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10600186/

10-13 02:33