我想使用RTTI替换属性的getter / setter。
我知道您可以使用TPropInfo.SetProc / GetProc访问getter setter,我知道这些字段指向不同的数据,具体取决于属性是使用虚方法,直接字段访问还是静态方法。
我很有兴趣用自定义虚拟方法替换指向虚方法的属性setter / getter。
TRttiInstanceProperty(RttiProperty).PropInfo^.SetProc := ? // SomeOtherInstance.Setter
TRttiInstanceProperty(RttiProperty).PropInfo^.GetProc := ? // SomeOtherInstance.Getter
答案 0 :(得分:4)
您无法以这种方式实现目标,因为您的问题是基于误解。 RTTI信息为您提供编译代码中指定的getter / setter。但是当您访问属性时,不会查询RTTI信息。而是直接调用getter / setter。
为了说明,请考虑以下规范只读属性:
property Count: Integer read GetCount;
您可以使用RTTI查询此属性,以找出实现getter的方法。但是当你在代码中写这个时:
Writeln(Obj.Count);
编译器将其转换为:
Writeln(Obj.GetCount);
并编译。在呼叫站点,从不咨询RTTI信息。因此,任何修改RTTI信息的尝试都不会影响访问该属性的代码。
您需要为您的问题找到不同的解决方案。