gpt4 book ai didi

delphi - 如何在Delphi 2010中使用RTTI创建对象实例?

转载 作者:行者123 更新时间:2023-12-03 14:37:04 24 4
gpt4 key购买 nike

众所周知,当我们像这样调用类的构造函数时:

instance := TSomeClass.Create;

Delphi 编译器实际上做了以下事情:

  1. 调用静态 NewInstance 方法分配内存并初始化内存布局。
  2. 调用构造方法执行类的初始化
  3. 调用 AfterConstruction 方法

简单易懂。但我不太确定编译器如何处理第二步和第三步中的异常。

在 D2010 中似乎没有明确的方法使用 RTTI 构造函数方法创建实例。所以我在Spring Framework for Delphi中编写了一个简单的函数来重现创建的过程。

class function TActivator.CreateInstance(instanceType: TRttiInstanceType;
constructorMethod: TRttiMethod; const arguments: array of TValue): TObject;
var
classType: TClass;
begin
TArgument.CheckNotNull(instanceType, 'instanceType');
TArgument.CheckNotNull(constructorMethod, 'constructorMethod');
classType := instanceType.MetaclassType;
Result := classType.NewInstance;
try
constructorMethod.Invoke(Result, arguments);
except
on Exception do
begin
if Result is TInterfacedObject then
begin
Dec(TInterfacedObjectHack(Result).FRefCount);
end;
Result.Free;
raise;
end;
end;
try
Result.AfterConstruction;
except
on Exception do
begin
Result.Free;
raise;
end;
end;
end;

我觉得可能不是100%正确。所以请给我指路。谢谢!

最佳答案

调用构造函数并将类作为 Self 参数(而不是实例)传递将正确构造该类。构建过程包括NewInstanceAfterConstruction等,您在这里手动执行:这不是必需的。

这应该足够了:

Result := constructorMethod.Invoke(instanceType.MetaclassType, arguments);

Delphi 的一个奇怪之处是它允许在实例和类上调用构造函数。此功能用作表单构建的一种“放置新”(C++ 术语),以便全局表单变量(例如,第一个表单默认为 Form1)在创建时分配OnCreate 构造函数被调用。因此,您的代码不会引发异常。但将类而不是实例作为 Self 参数传递更为正常。

关于delphi - 如何在Delphi 2010中使用RTTI创建对象实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3068775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com