Delphi FreePascal-RTTI。有办法调用方法吗?

Delphi FreePascal-RTTI。有办法调用方法吗?,delphi,runtime,rtti,fpc,Delphi,Runtime,Rtti,Fpc,我试图找出是否有一种方法可以实现类似于Delphi增强RTTI特性的功能 据我所知,FPC不提供自Delphi 2010年以来出现在Delphi中的RTTI功能。但是我想找到一些方法在运行时做一些技巧 在FPC中使用typinfo单元,我可以做以下事情: 获取对象发布属性列表-通过getPropList从typinfo单元获取 获取/设置对象已发布属性的值-通过GetPropValue(…):Variant/SetPropValue(…value:Variant) 获取发布的方法-通过Meth

我试图找出是否有一种方法可以实现类似于Delphi增强RTTI特性的功能

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

在FPC中使用
typinfo
单元,我可以做以下事情:

  • 获取对象发布属性列表-通过
    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;
所以我需要调用构造函数而不知道它的签名

所以我的问题是调用对象的方法并向其传递一些参数。它可能看起来像
函数CallMethod(实例:对象;方法名:字符串;参数:变量数组):Variant

如果我没有弄错的话,可以通过德尔福的2010+RTTI解决。但在使用增强型Delphi的RTTI之前,我想了解它在FPC中是否可行

换句话说,我当前的问题是将参数传递给例程。 我知道这可以通过这个方案来实现:

type
  TmyProc = procedure CallMe(x: byte);
...
  var proc: TmyProc;
...
  proc := pointerToFunc^;
  proc(0);
但是我需要在不知道参数的计数和类型的情况下实现它(在编译时)

有几个与该主题相关的链接:

第二篇文章()描述了一种通过名称将参数传递给从DLL导入的例程的方法。我想这差不多就是我需要的。但我不确定这种方式是否可靠

也许有任何库使用“旧的”typinfo单元(没有RTTI单元)实现这些东西

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

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

  • 您可以使用调用方法,即使尚未发布,但由您来确保参数列表正确
  • 您可以使用元类(类引用)调用构造函数,可以在TCollection中看到这个例子:您在运行时传递集合项的类,然后在需要时创建它。例如,通过使用虚拟(可能是抽象)构造函数定义抽象类,您可以得到所需的参数列表
  • 当然,在运行时无法确定参数列表,但是如果您同时设计了调用方法和调用方本身,那么有很多方法可以实现类似的行为
  • 例如,传递variant open array(),就像在Format()中一样,因此参数的数量及其类型可能会有所不同。但是,即使只有一个指针作为参数,您也可以传递任意数量的指针,您所需要做的就是找到它将引导的类

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