如何将classname转换为类?

Rol*_*son 4 delphi delphi-2007

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

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

它的作用是:

Size := TCountry.InstanceSize;
Run Code Online (Sandbox Code Playgroud)

但我希望这样:

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

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

Ond*_*lle 10

既然您正在使用字符串列表,那么您也可以在那里存储类:

var
  C: TClass;

  StringList.AddObject(C.ClassName, TObject(C));
Run Code Online (Sandbox Code Playgroud)

...

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

...


Uli*_*rdt 8

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


ale*_*lex 6

在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;
Run Code Online (Sandbox Code Playgroud)

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