delphi – 使用RTTI访问严格的私有字段

前端之家收集整理的这篇文章主要介绍了delphi – 使用RTTI访问严格的私有字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑这个简单的代码
  1. {$APPTYPE CONSOLE}
  2.  
  3. uses
  4. Rtti,SysUtils;
  5.  
  6. type
  7. {$M+}
  8. TFoo = class
  9. strict private
  10. class var Field1 : Integer;
  11. field2 : Integer;
  12. private
  13. field3 : Integer;
  14. class var Field4 : Integer;
  15. end;
  16.  
  17.  
  18. Var
  19. ctx : TRttiContext;
  20. f : TRttiField;
  21. begin
  22. try
  23. ctx:=TRttiContext.Create;
  24.  
  25. for f in ctx.GetType(TFoo).GetFields do
  26. Writeln(f.Name);
  27.  
  28.  
  29. Writeln('Done');
  30. readln;
  31. except
  32. on E: Exception do
  33. Writeln(E.ClassName,': ',E.Message);
  34. end;
  35. end.

运行此时,仅列出field3.似乎哪个RTTI不支持严格私有或类var的字段,所以问题是可以使用Rtti或其他方法访问delphi类的严格私有字段?我阅读了RTTI.TRttiType.GetFields方法的文档,但确实提到了这些限制,是否存在提及此类限制的任何文章文章

解决方法

我现在无法尝试,但您似乎需要的可能是GetDeclaredFields而不是GetFields.这应该给出类的所有(实例)字段,但不能给出祖先类的字段.如果你也需要这些,你必须递归地继承继承链.

正如我所说,我现在无法尝试,所以你必须亲自看看它是否允许你访问严格的私人领域.

更新

请注意,在您的TFoo声明中,即使您可能没有意图,Field1和Field2都是类变量!

只需重新格式化你的声明,你就会明白我的意思:

  1. TFoo = class
  2. strict private
  3. class var
  4. Field1: Integer;
  5. Field2: Integer;
  6. private
  7. // etc...

类var之后的所有内容都是类变量,直到编译器遇到var,strict,private,protected等.试试这个,你也会看到Field2被写入:

  1. TFoo = class
  2. strict private
  3. class var
  4. Field1: Integer;
  5. var
  6. Field2: Integer;
  7. // etc...

或者尝试:

  1. TFoo = class
  2. strict private
  3. Field2: Integer;
  4. class var
  5. Field1: Integer;
  6. // etc...

这意味着GetFields和GetDeclaredFields对严格的私有字段没有任何问题.他们只是不返​​回类变量.这是有道理的,IMO.类变量不是被调查对象的成员.

猜你在找的Delphi相关文章