将类字符串转换为TClass

时间:2011-06-17 07:13:14

标签: delphi delphi-7

给出类:     使用       InvokeRegistry; //定义了TRemotable。
    类型       TMyLabel = class(TRemotable)       //一些已发布的道具       TMySubLabel = class(TMyLabel)       //更多已发布的道具

  //some other classes descendent of TMyLabel.

  TMyLabelClass = class of TMyLabel;

我的要求是实施:

function StringToClass(string aClassName): TClass;
begin
  //your implementation goes here
end;

用法:

function GetMyLabelInstance(string aClassName):TMyLabel; 
var
  lCloned: TMyLabel;
begin
  Tclass lClass = StringToClass('TMySubLabel');
  lCloned := TMyLabelClass(lClass).Create;
end;

我使用Delphi 7并且我的对象不是从TPersistent派生的,因此这个解决方案不适用于我的情况: How to convert classname as string to a class?

谢谢,

1 个答案:

答案 0 :(得分:1)

由于您的课程不是TPersistent后代,您必须实施自己的RegisterClass / FindClass程序。

我通常通过在TStringList(或TDictionary<string, TClass>中为新的Delphi版本)注册名称来实现此目的,如TOndrej's answer中所述。我在定义类的单元的initialization部分进行注册。

然后,您可以使用FindClass函数根据其名称检索类,或者直接根据类的名称直接创建正确类的实例的工厂过程。

我还考虑一个好的做法,将TStringList,注册程序和工厂程序打包成一个单独实现的类。

如果要用作工厂,还必须向基类(TMyLabel)添加虚拟构造函数,并定义元类型TMyLabelClass = class of TMyLabel,并将StringList.Objects [i]强制转换为TMyLabelClass TClass