至于只返回 nil 的 RttiType 问题,这可能有一个原因:在您的测试中,您没有在任何时候实例化该类。编译器因为它从来没有对这个类的引用(因为它根本不是一个实例),所以作为一种优化形式,它只是从信息中删除它。请参阅下面的两个示例。当您在代码中的某个位置实例化类时,行为会有所不同。
假设以下类:
type
TTest = class
public
procedure Test;
end;
以及下面的代码:
var
LContext: TRttiContext;
LType: TRttiType;
LTest: TTest;
begin
LContext := TRttiContext.Create;
for LType in LContext.GetTypes do
begin
if LType.IsInstance then
begin
WriteLn(LType.Name);
end;
end;
end;
到目前为止,RTTI 无法使用 TTest 类信息。但是,当我们在应用程序中创建某个点时,会在编译中为它创建一个引用,从而使这些信息可用:
var
LContext: TRttiContext;
LType: TRttiType;
LTest: TTest;
begin
LTest := TTest.Create; //Here i´m using TTest.
//Could be in another part of the program
LContext := TRttiContext.Create;
for LType in LContext.GetTypes do
begin
if LType.IsInstance then
begin
WriteLn(LType.Name);
end;
end;
end;
此时,如果您使用LContext.FindType ('TTest'),则不会返回 nil,因为编译器保留了对该类的引用。这解释了您在测试中的行为。