delphi - TControlClass 作为通用 TControl 参数?

标签 delphi generics

我有课TLuaClassTemplate<T: TControl, constructor> = class并尝试使用它的方法 class procedure RegisterClass(L: Plua_State; p: TPrintProc; container: TComponent; vm: TLuaVm); static; TControlClass 引用存储在 TDictionary 中

  TClassNameToComponentDict = TDictionary<string, TControlClass>;
  TClassNameToComponentPair = TPair<string, TControlClass>;

...
  ClassNameToComponent := TClassNameToComponentDict.Create;
  ClassNameToComponent.Add('TButton', TButton);
  ClassNameToComponent.Add('TPanel', TPanel);
  ClassNameToComponent.Add('TEdit', TEdit);

但是我在尝试使用它时遇到问题

  enum: TClassNameToComponentPair;
  ctx: TRttiContext;
  cls: TControlClass;
begin
  for enum in vm.ClassNameToComponent do begin
    //TLuaClassTemplate<enum.Value>.RegisterClass(vm.LS, PrintGlobal, container, vm);
    cls := TControlClass((ctx.FindType(enum.Key) as TRttiInstanceType).MetaClassType);
    TLuaClassTemplate<cls>.RegisterClass(vm.LS, PrintGlobal, container, vm);
  end;

我尝试了当前可见(通过搜索找到)和评论选项。但错误是Undeclared identifier: 'TLuaClassTemplate'TLuaClassTemplate<TButton>.RegisterClass(vm.LS, PrintGlobal, container, vm);有效。

如何在这里使用 TControlClass 作为通用参数?

最佳答案

您遇到的问题是泛型的实例化要求类型参数在编译时已知。在你的代码中cls在编译时未知,仅在运行时确定。这意味着 TLuaClassTemplate<cls>是泛型的无效实例化。

这里的底线是泛型为您提供代码的参数化,但参数必须在编译时提供。由于您直到运行时才知道参数,因此无法使用泛型解决问题。

好吧,我说不能,但是您可以使用 RTTI 来调用您的通用方法。为此,您需要确保每个可能的实例化类型都包含在可执行文件的类型列表中。但这样做确实会违背泛型的目的!使用标准运行时参数比编译时通用参数要容易得多。

关于delphi - TControlClass 作为通用 TControl 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15601104/

相关文章:

Delphi、OmniXML - XML 绑定(bind)?

delphi - 分配给 TStringList 时字符串丢失数据

Java 泛型。如何正确扩展扩展通用抽象参数类型类的参数类型类

java - 将 JSONArray 的内容映射到给定类的 Java 函数?

Java 泛型 API 架构

string - 在Delphi中组合字符串和字符

delphi - 将设计器窗口置于背景中

delphi - 如何将数据从 TDataSet 移动到 TClientDataSet?我需要数据的 XML 表示

java - 需要帮助解释涉及泛型的 Java 代码

java - 如何在比较器的映射中使用泛型以避免警告