我有两个问题(其中至少一个关于D2010中的RTTI和动态实例化)


我正在阅读巴里·凯利(Barry Kelly)看来是conference talk的箔纸,并在p上找到。 13个看起来非常有趣的东西:TRTTIConstructor.Invoke。在相邻的要点中,人们发现“无需虚拟构造函数和元类即可动态构造实例”。这似乎是个很棒的功能(也是我所需要的,顺便说一句)!但是,当我查看D2010文档(ms-help://embarcadero.rs2010/vcl/Rtti.html)时,找不到。它被撤销了吗?
假设类名存储在字符串中,创建类实例的最小方法是什么?

最佳答案

我认为功能已被TRttiMethod吸收。它具有IsConstructor,IsDestructor和IsClassMethod属性,因此可以将其用于“特殊”类型的方法以及普通方法。

对于问题2,请尝试以下操作:

function GetConstructor(val: TRttiInstanceType): TRttiMethod;
var
   method: TRttiMethod;
begin
   for method in val.GetMethods('Create') do
   begin
      if (method.IsConstructor) and (length(method.GetParameters) = 0) then
         exit(method);
   end;
   raise EInsufficientRTTI.CreateFmt('No simple constructor available for class %s ',
                                     [val.MetaclassType.ClassName]);
end;


这将找到不带参数的称为Create的最高构造函数。如果知道要查找的内容,则可以对其进行修改以寻找具有其他签名的其他构造函数。然后只需对结果调用Invoke

07-24 21:44