想法很简单——用类名制作 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' 和 'class of TButton'”。
如何使用 TButton 等“类”作为通用值?