gpt4 book ai didi

delphi - FreePascal RTTI。有没有办法调用方法?

转载 作者:行者123 更新时间:2023-12-03 15:00:53 26 4
gpt4 key购买 nike

我正在尝试找出是否有一种方法可以完成类似于 Delphi 的增强 RTTI 功能的操作。

据我所知,FPC 不提供自 Delphi 2010 以来出现在 Delphi 中的 RTTI 功能。但我想找到一些方法在运行时执行一些技巧。

使用typinfo FPC中的单元我可以做这样的事情:

  • 获取对象已发布的属性列表 - 通过 getPropList来自typinfo单位;
  • 获取/设置对象已发布属性的值 - 通过 GetPropValue(...): Variant/SetPropValue(...Value: Variant) ;
  • 获取发布的方法 - 通过 MethodAddres ;

但我还没有找到一种方法来做这样的事情:

  • 调用方法;​​
  • 调用构造函数,或创建对象;

更新:构造函数的问题很像方法一 - 我希望有一种方法可以在其中传递不同的参数:

// concept of code
type

TClass = class of TObject;

TMyClass1 = class
public
constructor Create(Param1: Integer; Param2: string); override;
end;

TMyClass2 = class
public
constructor Create(ObjectParam: Object); override;
end;

TParams = array of Variant;

var
Classes: array of TClass
Instances: array of Object;
ParamArray: array of TParams;

...

For I := 0 to Count-1 do
begin
LocalConstructor := @(Classes[I].Create);
Instances[I] := CallConstructor(LocalConstructor, ParamArray[I]);
end;

所以我需要在不知道其签名的情况下调用构造函数。

所以我的问题是调用对象的方法并向其传递一些参数。它可能看起来像 function CallMethod(Instance: Object; MethodName: String; Params: array of Variant): Variant;

如果我没记错的话,可以通过 Delphi 的 2010+ RTTI 来解决。但在使用增强型Delphi的RTTI之前,我想了解一下在FPC中是否可以实现。

换句话说,我当前的问题是将参数传递给例程。我知道可以使用这个方案来完成:

type
TmyProc = procedure CallMe(x: byte);
...
var proc: TmyProc;
...
proc := pointerToFunc^;
proc(0);

但我需要在不知道参数数量和类型的情况下实现它(在编译时)。

有一些与该主题相关的链接:

Delphi: Call a function whose name is stored in a string

http://www.swissdelphicenter.ch/torry/showcode.php?id=1745

第二篇文章 ( http://www.swissdelphicenter.ch/torry/showcode.php?id=1745 ) 描述了一种将参数传递给按名称从 DLL 导入的例程的方法。我想这几乎是我所需要的。但我不确定这种方式是否可靠。

也许有任何库可以使用“旧”typinfo 单元(没有 RTTI 单元)实现这些功能?

此外,我对创建某种通用事件处理程序的方法感兴趣 - 可以分配给不同事件(具有不同参数集)的过程,例如:

procedure myEventHandler(params: array of variant);
...
Button.OnClick := myEventHandler;
Button.OnMouseMove := myEventHandler;

这可能吗?或者至少是类似的东西?

最佳答案

  1. 您可以使用 MethodAddress 调用方法,即使未发布方法也是如此。 ,但由您来确保参数列表正确。
  2. 您可以使用元类(类引用)调用构造函数,在 TCollection 中可以看到这样的示例:您在运行时传递集合项的类,然后可以在需要时创建它。通过使用虚拟(可能是抽象)构造函数定义抽象类,您可以想出您想要的参数列表,例如 here .
  3. 据我所知,无法在运行时确定参数列表,但如果您设计调用方法和调用者本身,则有很多方法可以实现类似的行为。

例如,您传递变体开放数组 ( Array of const ),就像在 Format() 中完成的那样,因此参数数量及其类型可能会有所不同。但即使有一个且唯一的指针作为参数,您也可以传递任意数量的指针,您所需要做的就是想出它将引导到的某个类。

关于delphi - FreePascal RTTI。有没有办法调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36188402/

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