2013-03-24 20 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來調用你的泛型方法。爲了這個工作,你需要確保每個可能的實例化類型都包含在可執行文件的類型列表中。但是做所有這些都會真正擊敗泛型的目的!使用標準運行時參數比編譯時間通用參數要容易得多。