Gotcha! Có vẻ như vấn đề được ẩn giấu trong tờ khai về phía trước mà tôi đã bỏ qua. Không biết tính năng lén lút đó.
Dường như trình biên dịch chỉ xem xét việc kê khai đầu tiên của lớp để tạo RTTI hay không vì vậy nếu bạn có một lời tuyên bố về phía trước như thế này ...
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;
... Bạn sẽ nhận được lỗi khẳng định. Vì vậy, để nhận được RTTI đúng, người ta cần để biến {$ MethodInfo} Chỉ thị về việc khai báo về phía trước, như đã thấy ở đây ....
type
{$METHODINFO ON}
TMyClass = class;
{$METHODINFO OFF}
...
...
TMyClass = class
private
fField: integer;
published
property Field: integer read fField write fField;
end;
...
Nguồn
2008-12-04 00:59:43
tôi đã đi qua này "tính năng" đã có, quá. BTW, không cần phải bật {$ METHODINFO ON} đầy đủ, chỉ đủ dùng {$ TYPEINFO ON} hoặc {$ M +}. –
Cần lưu ý rằng trong Delphi 2009, trình biên dịch thêm {M +} vào bất kỳ lớp nào có phần "được xuất bản" tự động, vì vậy vấn đề này không còn tồn tại nữa. –