gpt4 book ai didi

Delphi - 从字符串创建类

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

我有这样的代码

name := 'Foo';
If name = 'Foo' then
result := TFoo.Create
else if name = 'Bar' then
result := TBar.Create
else if name = 'FooFoo' then
result := TFooFoo.Create;

有没有办法做到这一点

result := $name.create

或者某种基于变量值创建类的方法?

所有类都扩展了相同的基类。

最佳答案

从 Delphi 2010 开始,增强的 RTTI 允许您无需创建自己的类注册表即可执行此操作。

使用 RTTI 单元,您有多种可用选项。

对于无参数构造函数,最简单的之一是。

var
C : TRttiContext;
O : TObject;
begin
O := (C.FindType('UnitName.TClassName') as TRttiInstanceType).MetaClassType.Create;
...
end;

这是使用 TRttiMethod.Invoke() 传递参数的示例

var
C : TRttiContext;
T : TRttiInstanceType;
V : TValue;

begin
T := (C.FindType('StdCtrls.TButton') as TRttiInstanceType);
V := T.GetMethod('Create').Invoke(T.metaClassType,[self]);
(V.AsObject as TWinControl).Parent := self;
end;

我写了several articlesRTTI 单元上,因为有很多可用选项。

<小时/>

更新根据 David 请求:

比较使用类类型(虚拟构造函数)与 TRttiType.Invoke 的构造用法

类类型方法:(虚拟构造函数)

  • 适用于所有版本的 Delphi
  • 生成更快的代码
  • 需要在编译时了解祖先信息。
  • 需要类注册表通过字符串名称查找类(例如 RRUZ 提到的)

TRttiType.Invoke()方法

  • 仅适用于 Delphi 2010 或更高版本。
  • 较慢的代码
  • 实现考虑名称冲突的类注册表
  • 在编译时无需了解祖先信息。

我个人发现每个都有不同的目的。如果我预先知道所有类型,我将使用类类型方法。

关于Delphi - 从字符串创建类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5772755/

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