如何将类名作为字符串转换为类?

时间:2010-04-28 07:53:57

标签: delphi delphi-2007

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

现在我想通过循环列表找出尺寸。

它的作用是:

Size := TCountry.InstanceSize;

但我想这样:

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

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

4 个答案:

答案 0 :(得分:10)

由于您正在使用字符串列表,因此您也可以在那里存储类:

var
  C: TClass;

  StringList.AddObject(C.ClassName, TObject(C));

...

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

...

答案 1 :(得分:8)

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

答案 2 :(得分: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;

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

答案 3 :(得分:2)

  1. 您必须使用FindClass按名称查找类引用。如果找不到类,则会引发异常。
  2. 您可以选择为您的类调用RegisterClass,如果它们未在代码中明确引用。