Delphi 2010: whatever happened to TRTTIConstructor?

跟風遠走 提交于 2019-12-10 03:32:26

问题


I've got two questions (of which at least one is regarding RTTI in D2010 and dynamic instancing)

  1. I was reading what appears to be the foils for a conference talk by Barry Kelly, and found on p. 13 something that looked really interesting: TRTTIConstructor.Invoke. In an adjacent bullet point, one finds "Dynamically construct instances without needing virtual constructors and metaclasses". This seems like a great feature (and exactly what I need, btw)! However, when I look in the D2010 docs (ms-help://embarcadero.rs2010/vcl/Rtti.html), I can't find it. Did it get revoked?
  2. What is the minimal way of creating an instance of a class, provided the class name is stored in a string?

回答1:


I think that functionality has been absorbed into TRttiMethod. It has IsConstructor, IsDestructor and IsClassMethod properties so that it can be used for "special" types of methods as well as normal ones.

As for question 2, try something like this:

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;

This finds the highest constructor called Create that takes no parameters. You can modify it to look for other constructors with other signatures, if you know what you're looking for. Then just call Invoke on the result.




回答2:


Although you can call .GetMethod() to get the constructor you can also do the following to construct instances of objects with no parameters for the constructor.

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

If know the base type you can type cast the class to pass the parameters if you wish. Here is an example of creating a Component

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



来源:https://stackoverflow.com/questions/2500542/delphi-2010-whatever-happened-to-trtticonstructor

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!