Dan*_*ves 8 delphi reflection rtti delphi-xe4
在以下类型中:
MyClass = class(TInterfacedPersistent)
private
FMyProperty: Integer;
published
procedure setMyProperty(Value: Integer); virtual;
property MyProperty: Integer read FMyProperty write setMyProperty;
Run Code Online (Sandbox Code Playgroud)
我想通过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;
Run Code Online (Sandbox Code Playgroud)
虽然指针不是nil,但我所有的都是空消息.有人给我一些小费吗?
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;
Run Code Online (Sandbox Code Playgroud)
这仅适用于虚拟设置,对于静态消息是空的.感谢大家!
读c:\rad studio\9.0\source\rtl\common\System.Rtti.pas
procedure TRttiInstanceProperty.DoSetValue
Run Code Online (Sandbox Code Playgroud)
属性的设置者可以是
这些情况PropInfo^.SetProc
对其值具有不同的语义。直接寻址仅适用于静态程序。对于虚拟方法,您添加 VMT 偏移量并从该内存单元获取代码地址,如我提到的代码中指定的那样(但由于版权原因不会引用)。
或者您可以使用TRttiProperty.SetValue
并让 Delphi 完成所有这些底层细节。请参阅http://docwiki.embarcadero.com/Libraries/XE2/en/System.Rtti.TRttiProperty.SetValue
编辑:
Extended RTTI
而不是classic
一个- 这是有问题的主张。Extended RTTI
众所周知,它的工作速度明显比经典的慢。不知道是否有人对它进行了分析,但我怀疑这主要是由于TValue
. 你可以google一下,发现很多人抱怨TValue
实施速度慢,并提供了效率固定的替代方案。然而,由于Extended RTTI
仅使用库存,TValue
它无法从这些实现中受益,并且仍然比经典实现慢。 归档时间: |
|
查看次数: |
2886 次 |
最近记录: |