加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – TControlClass作为通用TControl参数?

发布时间:2020-12-15 09:17:35 所属栏目:大数据 来源:网络整理
导读:我有类TLuaClassTemplate T:TControl,构造函数 = class并尝试使用它的方法类过程RegisterClass(L:Plua_State; p:TPrintProc; container:TComponent; vm:TLuaVm);静态的; TControlClass引用存储在TDictionary中 TClassNameToComponentDict = TDictionary
我有类TLuaClassTemplate< T:TControl,构造函数> = class并尝试使用它的方法类过程RegisterClass(L:Plua_State; p:TPrintProc; container:TComponent; vm:TLuaVm);静态的; TControlClass引用存储在TDictionary中

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

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

但我尝试使用它有问题

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,vm);
  end;

我已经尝试了当前可见(通过搜索找到)和评论选项.但错误是Undeclared标识符:’TLuaClassTemplate’而TLuaClassTemplate< TButton> .RegisterClass(vm.LS,vm);作品.

我如何在这里使用TControlClass作为通用参数?

解决方法

您遇到的问题是泛型的实例化要求在编译时知道类型参数.在您的代码中,cls在编译时是未知的,它仅在运行时确定.这意味着TLuaClassTemplate< cls>是泛型的无效实例化.

这里的底线是泛型为您提供代码参数化,但必须在编译时提供参数.由于您在运行时之前不知道参数,因此无法使用泛型来解决问题.

嗯,我说,不能,但你可以使用RTTI来调用你的泛型方法.为此,您需要确保每个可能的实例化类型都包含在可执行文件的类型列表中.但这样做真的会破坏仿制药的目的!使用标准运行时参数比编译时通用参数要容易得多.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读