gpt4 book ai didi

Delphi - 提取属性的setter方法的名称

转载 作者:行者123 更新时间:2023-12-03 14:49:01 25 4
gpt4 key购买 nike

采用以下类型:

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;

虽然指针不为零,但我所拥有的只是一条空消息。有人可以给我一些建议吗?

P.S.:我正在使用 Delphi XE4,我知道我应该使用扩展 RTTI 而不是经典,但无论如何,我无法在这两个功能中实现我想要的功能...因此,任何帮助将不胜感激。感谢您的回复。

<小时/>

最终版,问题已解决:

这是基于(我的 friend 和...)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;

这仅适用于虚拟设置者,对于静态,消息为空。谢谢大家!

最佳答案

您可以检索此方法名称,如果

a) 将方法移至 published 部分(经典 RTTI 仅适用于此部分(更准确地说 - 使用 {$M+} 指令编译))

b) 使用正确的类说明符 - MyClass.MethodName,因为 MethodName 是类函数

此代码适用于 D7 和 XE3:

MyClass = class(TInterfacedPersistent)
private
FMyProperty: Integer;
published
procedure setMyProperty(Value: Integer);
property MyProperty: Integer read FMyProperty write setMyProperty;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
ppi: PPropInfo;
begin
ppi := GetPropInfo(MyClass, 'MyProperty');
ShowMessage(MyClass.MethodName(ppi.SetProc));
end;

附注您使用的 Delphi 版本是什么? 怎么样Extended RTTI (自 D2010 起)?

关于Delphi - 提取属性的setter方法的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17690229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com