我正在尝试找出是否有一种类似于Delphi的增强RTTI功能的方法。
据我所知,FPC不提供自Delphi 2010以来出现的RTTI功能。但是我想找到一些在运行时进行一些技巧的方法。
在FPC中使用typinfo单元,我可以做到以下事情:
这是可能的吗?或者至少有类似的东西吗?
据我所知,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);
但我需要在不知道参数数量和类型的情况下(在编译时)实现它。
以下是与该主题相关的一些链接:
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;
这是可能的吗?或者至少有类似的东西吗?