我在字符串列表中有类名。例如它可能是 'TPlanEvent','TParcel','TCountry'等。
现在我想通过循环列表找出尺寸。
它的作用是:
Size := TCountry.InstanceSize;
但我想这样:
for i := 0 to ClassList.Count - 1 do
Size := StringToClass(ClassList[i]).InstanceSize;
显然我的问题是编写什么而不是方法StringToClass将字符串转换为类。
答案 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,则可以使用RegisterClass和FindClass或GetClass。否则你可以自己写一些注册机制。
答案 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)