即使使用正确的{$ 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;
答案 0 :(得分:5)
疑难杂症!似乎这个问题隐藏在我忽略的前瞻声明中。不知道偷偷摸摸的功能。
似乎编译器只考虑生成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;
...
答案 1 :(得分:1)
我很高兴您找到了解决方案。与$TypeInfo
指令是一回事。 Delphi 7帮助说:
请注意,如果一个类是前向声明的,那么必须使用
$M
开关声明该类的第一个声明。
P.S。:$M+/- = $TypeInfo On/Off