FreePascal RTTI. 是否有一种方法来调用方法?

6
我正在尝试找出是否有一种类似于Delphi的增强RTTI功能的方法。
据我所知,FPC不提供自Delphi 2010以来出现的RTTI功能。但是我想找到一些在运行时进行一些技巧的方法。
在FPC中使用typinfo单元,我可以做到以下事情:
  • 通过typinfo单元中的getPropList获取对象发布的属性列表;
  • 通过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:调用存储在字符串中的函数名称

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个回答

5
  1. 你可以使用MethodAddress调用方法,即使这些方法未被发布,但你需要确保正确的参数列表。
  2. 你可以使用元类(类引用)来调用构造函数,例如TCollection中就有这样的例子:在运行时传递集合项的类,然后在需要时创建它。通过定义一个具有虚拟(可能是抽象的)构造函数的抽象类,你可以自己设计所需的参数列表,一些示例在这里
  3. 据我所知,在运行时无法确定参数列表,但如果你设计要调用的方法和调用方本身,则有许多方法可以实现类似的行为。
例如,在Format()中,您可以传递变量开放数组(Array of const),因此参数数量和类型可能会有所不同。但即使只有一个指针作为参数,您也可以传递尽可能多的指针,您需要做的就是想出一些类来处理它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接