在TDictionary中使用"class of"?

use*_*150 4 delphi

想法很简单 - 将带有类名的TDictionary用于TComponent

for enum in vm.ClassNameToComponent do
 TLuaClassTemplate<enum.Value>.RegisterClass(vm.LS, PrintGlobal, container, vm);
Run Code Online (Sandbox Code Playgroud)

用enum而不是

TLuaClassTemplate<TButton>.RegisterClass(vm.LS, PrintGlobal, container, vm);
TLuaClassTemplate<TPanel>.RegisterClass(vm.LS, PrintGlobal, container, vm);
TLuaClassTemplate<TEdit>.RegisterClass(vm.LS, PrintGlobal, container, vm);
...
Run Code Online (Sandbox Code Playgroud)

并使用从xml中获取的类名来处理基于泛型的类.
但是有问题:

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

错误"不兼容的类型'TComponent'和'类TButton'".
如何使用TButton等"类"作为通用值?

Dav*_*nan 5

您使用的类型

TDictionary<string, TComponent>
Run Code Online (Sandbox Code Playgroud)

表示从字符串到类实例的映射.但是你想要一个从字符串到的映射.所以你需要:

TDictionary<string, TComponentClass>
Run Code Online (Sandbox Code Playgroud)

哪里

TComponentClass = class of TComponent
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要声明,TComponentClass因为它已在Classes单元中声明.