即使使用正确的{$ METHODINFO}指令声明了给定的类,GetPropInfo是否有可能返回nil。
type
...
...
{$METHODINFO ON}
TMyClass = class
private
fField: integer;
published
property Field: integer read fField write fField;
end;
{$METHODINFO OFF}
...
...
procedure TestRTTI;
begin
assert(assigned(GetPropInfo(TMyClass, 'Field')), 'WTF! No RTTI found!');
end;
最佳答案
知道了!似乎问题隐藏在我忽略的前向声明中。不知道那个偷偷摸摸的功能。
似乎编译器仅考虑该类的第一个声明来生成RTTI还是不考虑,因此如果您具有这样的前向声明...
type
TMyClass = class;
...
...
{$METHODINFO ON}
TMyClass = class
private
fField: integer;
published
property Field: integer read fField write fField;
end;
{$METHODINFO OFF}
...
...
procedure TestRTTI;
begin
assert(assigned(GetPropInfo(TMyClass, 'Field')), 'WTF! No RTTI found!');
end;
...您将得到断言错误。因此,为了正确设置RTTI,需要打开{$ METHODINFO}指令以进行前向声明,如此处所示。
type
{$METHODINFO ON}
TMyClass = class;
{$METHODINFO OFF}
...
...
TMyClass = class
private
fField: integer;
published
property Field: integer read fField write fField;
end;
...
关于Delphi RTTI麻烦: GetPropInfo returns nil with {$METHODINFO ON}?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/339172/