【问题标题】:How to convert classname as string to a class?如何将类名作为字符串转换为类?
【发布时间】:2010-04-28 07:53:56
【问题描述】:

我在字符串列表中有类名。例如它可能是 'TPlanEvent'、'TParcel'、'TCountry' 等

现在我想通过循环列表找出大小。

它的工作原理是:

Size := TCountry.InstanceSize;

但我想要这样:

for i := 0 to ClassList.Count - 1 do
  Size := StringToClass(ClassList[i]).InstanceSize;

显然我的问题是写什么而不是方法 StringToClass 来将字符串转换为类。

【问题讨论】:

    标签: delphi delphi-2007


    【解决方案1】:

    由于您使用的是字符串列表,因此您也可以在其中存储类:

    var
      C: TClass;
    
      StringList.AddObject(C.ClassName, TObject(C));
    

    ...

    for I := 0 to StringList.Count - 1 do
      Size := TClass(StringList.Objects[I]).InstanceSize;
    

    ...

    【讨论】:

    • 这当然只有在 OT 自己填写列表的情况下才有效,如果该列表是从文件或类似的东西中读取的...
    【解决方案2】:

    如果您的类派生自 TPersistent,您可以使用 RegisterClassFindClassGetClass 。否则你可以自己写一些注册机制。

    【讨论】:

      【解决方案3】:

      在 Delphi 2010 中,您可以使用:

      function StringToClass(AName: string): TClass;
      var
        LCtx: TRttiContext;
        LTp: TRttiType;
      begin
        Result := nil;
      
        try
          LTp := LCtx.FindType(AClassName);
        except
          Exit;
        end;
      
        if (LTp <> nil) and (LTp is TRttiInstanceType) then
          Result := TRttiInstanceType(LTp).Metaclass;
      end;
      

      一个音符。由于您只将类名保留在列表中,因此此方法将不起作用,因为 TRttiContext.FindType 需要一个完全限定的类型名(例如 uMyUnit.TMyClass)。解决方法是将存储这些类的单元附加到循环或列表中。

      【讨论】:

      • 不幸的是我使用的是 Delphi 2007
      【解决方案4】:
      1. 您必须使用 FindClass 按名称查找类引用。如果找不到类,则会引发异常。
      2. (可选)您必须为您的类调用 RegisterClass,如果它们没有在代码中显式引用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多