在Delphi 10 Seattle中,我可以使用以下代码解决过度严格的可见性限制。
如何访问私有变量?
type TBase = class(TObject) private FMemberVar: integer; end;
而我如何获得普通或虚拟的私有方法?
type TBase2 = class(TObject) private procedure UsefullButHidden; procedure VirtualHidden; virtual; procedure PrevIoUslyProtected; override; end;
Previously I would use a class helper to break open the base class.
type TBaseHelper = class helper for TBase function GetMemberVar: integer;
在Delphi 10.1 Berlin中,课堂助手不再能访问主题类或记录的私人成员。
有没有其他途径来访问私人会员?
解决方法
如果为类私有成员生成了扩展的RTTI信息 – 字段和/或方法,您可以使用它来访问它们。
当然,通过RTTI的访问速度比通过课堂帮助者慢。
访问方式:
var Base: TBase2; Method: TRttiMethod; Method := TRttiContext.Create.GetType(TBase2).GetMethod('UsefullButHidden'); Method.Invoke(Base,[]);
访问变量:
var Base: TBase; v: TValue; v := TRttiContext.Create.GetType(TBase).GetField('FMemberVar').GetValue(Base);
为RTL / VCL / FMX类生成的默认RTTI信息如下
>字段 – 私人,受保护,公开,发布
>方法 – 公开发表
>属性 – 公开,已发布
不幸的是,这意味着通过RTTI访问核心Delphi库的私有方法是不可用的。 @LU RD’s answer涵盖黑客,允许私有方法访问类,而不需要扩展RTTI。