在以下类型中:
MyClass = class(TInterfacedPersistent)
private
FMyProperty: Integer;
published
procedure setMyProperty(Value: Integer); virtual;
property MyProperty: Integer read FMyProperty write setMyProperty;
我想通过 RTTI 知道“MyProperty”属性的 setter 方法的名称。我尝试了以下方法:
procedure ShowSetterMethodsNames(pMyObject: TObject);
var
vPropList: TPropList;
vCount, I: Integer;
begin
vCount:= GetPropList(pMyObject.ClassInfo, tkProperties, @vPropList);
for I:= 0 to vCount -1 do
begin
if Assigned(vPropList[I]^.SetProc) then
ShowMessage(pMyObject.ClassType.MethodName(vPropList[I]^.SetProc));
end;
end;
虽然指针不是零,但我只有一条空消息。有人给我一些提示吗?
PS:我使用的是 Delphi XE4,我知道我应该使用扩展 RTTI 而不是经典,但无论如何,我不能在这两个功能中做我想要的......所以,任何帮助将不胜感激。感谢您的回复。
最终版,问题已解决:
这是基于(我朋友的帮助和......)RTTI单元(TRTTIInstanceProperty类的DoSetValue方法)的代码:
procedure ShowVirtualSettersNames(pObject: Pointer);
var
vSetter, vPointer: Pointer;
vPropList: TArray<TRttiProperty>;
vProp: TRttiProperty;
begin
vPropList:= RTTIUtils.ExtractProperties(TObject(pObject).ClassType); // Helper to get properties from a type, based in extended RTTI
for vProp in vPropList do
begin
vPointer:= TRttiInstanceProperty(vProp).PropInfo^.SetProc;
vPointer:= PPointer(PInteger(pObject)^ + Smallint(vPointer))^;
ShowMessage(TObject(pObject).ClassType.MethodName(vPointer));
end;
end;
这仅适用于虚拟二传手,对于静态消息是空的。感谢大家!