我正试图使用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?
答案 0 :(得分:7)
您对FindType
方法的调用不会返回Rtti信息,因为此函数works only for public types
。因此,如果您检查rType.IsPublicType
属性,则返回的值为false。
公共类型必须在单元的接口部分声明(被识别为公共)。因此,如果将TMyClass
类定义移动到单元的接口部分,则可以毫无问题地使用FindType
。