Delphi FreePascal-RTTI。有办法调用方法吗?
我试图找出是否有一种方法可以实现类似于Delphi增强RTTI特性的功能 据我所知,FPC不提供自Delphi 2010年以来出现在Delphi中的RTTI功能。但是我想找到一些方法在运行时做一些技巧 在FPC中使用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
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;