2013-03-24 23 views
4

我有TLuaClassTemplate<T: TControl, constructor> = class类,并试图使用它的方法class procedure RegisterClass(L: Plua_State; p: TPrintProc; container: TComponent; vm: TLuaVm); static;与存储在TDictionaryTControlClass作为一般的TControl参数?

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

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

TControlClass引用但我有尝试的问题,用它

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这里泛型参数?

+0

谢谢,并不断问好问题。我继续投票,因为他们问得很好,很有趣! – 2013-03-24 17:14:11

回答

4

,你必须是一个通用的该实例的问题需要的类型参数是在编译时已知。在你的代码cls在编译时已知的,它只是在运行时确定。这意味着TLuaClassTemplate<cls>是泛型的无效实例。

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

那么,我说,不能,但你可以使用RTTI来调用你的泛型方法。为了这个工作,你需要确保每个可能的实例化类型都包含在可执行文件的类型列表中。但是做所有这些都会真正击败泛型的目的!使用标准运行时参数比编译时间通用参数要容易得多。