Delphi 2010:TRTTIConstructor发生了什么?

时间:2010-03-23 14:11:17

标签: delphi delphi-2010 rtti

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

  1. 我正在阅读Barry Kelly撰写的conference talk的箔片,并在p。 13看起来非常有趣的东西:TRTTIConstructor.Invoke。在相邻的项目符号点中,可以找到“动态构造实例而无需虚拟构造函数和元类”。这似乎是一个很棒的功能(正是我需要的,顺便说一下)!但是,当我查看D2010文档(ms-help://embarcadero.rs2010/vcl/Rtti.html)时,我找不到它。它被撤销了吗?
  2. 如果类名存储在字符串中,创建类实例的最小方法是什么?

2 个答案:

答案 0 :(得分:10)

我认为该功能已被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

答案 1 :(得分:2)

虽然您可以调用.GetMethod()来获取构造函数,但您也可以执行以下操作来构造没有构造函数参数的对象实例。

function CreateInstance(aType : TRttiType) : TObject;
begin
  // Option #1
  result := aType.AsInstance.MetaclassType.Create;
  // Option #2
  result := aType.GetMethod('Create').Invoke(aType.AsInstance.MetaclassType,[]);
end;

如果您知道基本类型,则可以根据需要输入类来传递参数。 以下是创建组件

的示例

result := TComponentClass(aType.AsInstance.MetaClassType).Create(OwnerValue);