想法很简单-将具有类名的TDictionary创建为TComponent以使用

for enum in vm.ClassNameToComponent do
 TLuaClassTemplate<enum.Value>.RegisterClass(vm.LS, PrintGlobal, container, vm);


用枚举代替

TLuaClassTemplate<TButton>.RegisterClass(vm.LS, PrintGlobal, container, vm);
TLuaClassTemplate<TPanel>.RegisterClass(vm.LS, PrintGlobal, container, vm);
TLuaClassTemplate<TEdit>.RegisterClass(vm.LS, PrintGlobal, container, vm);
...


并使用从xml提取的类名称来处理基于通用的类。
但是有问题:

TClassNameToComponentDict = TDictionary<string, TComponent>;
...
ClassNameToComponent: TClassNameToComponentDict;
...
  ClassNameToComponent := TClassNameToComponentDict.Create;
  ClassNameToComponent.Add('TButton', TButton);
  ClassNameToComponent.Add('TPanel', TPanel);
  ClassNameToComponent.Add('TEdit', TEdit);
...


错误“类型'TComponent'和'TButton类'不兼容”。
如何使用TButton等“类”作为泛型值?

最佳答案

您使用的类型

TDictionary<string, TComponent>


表示从字符串到类实例的映射。但是您想要一个从字符串到类的映射。因此,您需要:

TDictionary<string, TComponentClass>


哪里

TComponentClass = class of TComponent


请注意,由于TComponentClass已经在Classes单元中声明,因此无需声明。

10-08 05:18