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

时间:2014-02-13 09:16:45

标签: delphi rtti delphi-xe5

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

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

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

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

1 个答案:

答案 0 :(得分:4)

您无法以这种方式实现目标,因为您的问题是基于误解。 RTTI信息为您提供编译代码中指定的getter / setter。但是当您访问属性时,不会查询RTTI信息。而是直接调用getter / setter。

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

property Count: Integer read GetCount;

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

Writeln(Obj.Count);

编译器将其转换为:

Writeln(Obj.GetCount);

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

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