想法很简单 - 将带有类名的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等“类”作为通用值?
答案 0 :(得分:5)
您使用的类型
TDictionary<string, TComponent>
表示从字符串到类的实例的映射。但是您需要从字符串到类的映射。所以你需要:
TDictionary<string, TComponentClass>
其中
TComponentClass = class of TComponent
请注意,您无需声明TComponentClass
,因为它已在Classes
单元中声明。