Delphi Web Script:如何通过RTTI公开类,其中包含一个返回另一个(公开)类的方法

时间:2011-04-20 08:31:42

标签: delphi rtti dwscript

我有这个Delphi类

type
  TAnotherClass = class
  end;

  TMyClass = class
    function Foo: TAnotherClass;
  end;

function TMyClass.Foo: TAnotherClass;
begin
  Result := TAnotherClass.Create;
end;

现在我想通过“dwsRTTIExposer.pas”公开这个课程:

myUnit.ExposeRTTI(TypeInfo(TMyClass));
myUnit.ExposeRTTI(TypeInfo(TAnotherClass));

我的脚本看起来像那样:

var a: TMyClass = TMyClass.Create;
var b: TAnotherClass;
b := a.Foo;

不幸的是,Delphi Web Script无法将TMyClass.Foo的返回值识别为有效的脚本类。有没有可能做到这一点而不回退到使用OnEval-Eventhandler手动公开每个方法?

1 个答案:

答案 0 :(得分:2)

ExposeRTTI目前不支持类类型的参数。

这是因为在脚本中返回一个直接的Delphi类可能会有问题,因为Delphi对象的生命周期是任意的和未确定的(Delphi端对象可以在任何时候被销毁,而不会通知fi)。

您不必手动公开每个方法,您可以对涉及基本类型的每个方法使用RTTI公开程序,并且只需手动处理涉及类类型的方法。

那将让你不得不决定如何暴露脚本端对象,以及它们与Delphi端对象的关系,这是RTTI没有提供线索的东西。

例如,对于原始代码,OnEval代码只会创建一个新的脚本对象,该对象包含每个调用的方法Result。

但是如果将其实现改为类似

,那么Foo的RTTI签名仍将完全相同
TMyClass = class
   private
      FFoo: TAnotherClass;
   public
      function Foo: TAnotherClass;
end;

function TMyClass.Foo: TAnotherClass;
begin
   if FFoo=nil then
      FFoo := TAnotherClass.Create;
   Result := FFoo;
end;

但是在这种情况下,OnEval必须完全不同,因为您必须在后续调用中返回相同的脚本端对象,并且您还需要挂钩脚本端对象的析构函数以正确处理私人FFoo领域的后果。

一旦Delphi拥有真正的垃圾收集对象,就可以放宽约束,但目前唯一接近的是TInterfacedObject,这是不安全的,你仍然需要处理手动事件处理程序来处理循环引用或禁用引用计数的类(如VCL组件)。