【问题标题】:How to modify delphi property Getter/Setter with RTTI?如何使用 RTTI 修改 delphi 属性 Getter/Setter?
【发布时间】:2014-02-13 09:16:44
【问题描述】:

我想用 RTTI 替换属性的 getter/setter。

我知道您可以使用 TPropInfo.SetProc/GetProc 访问 getter setter,并且我知道这些字段指向不同的数据,具体取决于属性是使用虚拟方法、直接字段访问还是静态方法。

我对用自定义虚拟方法替换指向虚拟方法的属性 setter/getter 很感兴趣。

TRttiInstanceProperty(RttiProperty).PropInfo^.SetProc := ? // SomeOtherInstance.Setter
TRttiInstanceProperty(RttiProperty).PropInfo^.GetProc := ? // SomeOtherInstance.Getter

【问题讨论】:

  • 您想要实现的最佳方法可能是首先使用虚拟 getter/setter,然后使用虚拟方法拦截。

标签: delphi rtti delphi-xe5


【解决方案1】:

您无法通过这种方式实现目标,因为您的问题是基于错误的概念。 RTTI 信息为您提供编译代码中指定的 getter/setter。但是当您访问一个属性时,不会参考 RTTI 信息。而是直接调用 getter/setter。

为了说明,请考虑以下规范的只读属性:

property Count: Integer read GetCount;

您可以使用 RTTI 查询该属性以找出实现 getter 的方法。但是,当您在代码中编写此代码时:

Writeln(Obj.Count);

编译器将其翻译为:

Writeln(Obj.GetCount);

并编译它。在呼叫站点,从不咨询 RTTI 信息。因此,任何修改 RTTI 信息的尝试都不会影响访问该属性的代码。

您需要为您的问题找到不同的解决方案。

【讨论】:

  • 有道理。太糟糕了。我正在尝试让基类拥有在子类中定义的属性字段。为此,我需要知道该字段何时更改。我认为拦截属性可以完成这项工作,但显然不是。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 2010-11-14
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多