如何使用 RTTI 修改 Delphi 属性的 Getter/Setter?

4

我希望使用RTTI来替换属性的getter/setter。

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

我想要替换指向虚方法的属性setter/getter,使用自定义虚方法。

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

3
你想实现的最佳方法可能是先使用虚拟getter/setter,然后再使用虚拟方法拦截。 - Stefan Glienke
1个回答

4
这种方式无法实现您的目标,因为您的问题基于一个误解。RTTI信息提供了编译代码中指定的getter/setter。但是,当您访问属性时,并不会咨询RTTI信息,而是直接调用getter/setter。
举个例子,考虑以下经典只读属性:
property Count: Integer read GetCount;

你可以使用RTTI查询此属性,以查找实现getter的方法。但是当你在代码中编写以下内容时:
Writeln(Obj.Count);

编译器将其翻译为:
Writeln(Obj.GetCount);

并将其编译。在调用站点上,永远不会查询RTTI信息。因此,任何尝试修改RTTI信息的操作都不会影响访问属性的代码。

你需要找到一个不同的解决方案来解决你的问题。


有道理。太糟糕了。我正在尝试让基类拥有子类定义的属性字段。为了做到这一点,我需要知道字段何时发生变化。我以为拦截属性会完成这个任务,但显然不行。 - monoceres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接