我知道用所谓的反射可以实现,但目前我掌握的方法是使用System.Type,不能利用编译期类型检查,
就是说如果类型错误,运行期才可发现。
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;  TClassParentClass = class of TClassParent;  TClassParent = class
  public
    function getValue: string;virtual;abstract;
  end;  TClassChild1 = class(TClassParent)
  public
    function getValue: string;override;
  end;  TClassGrandson1 = class(TClassChild1)
  public
    function getValue: string;override;
  end;  TClassChild2 = class(TClassParent)
  public
    function getValue: string;override;
  end;var
  Form1: TForm1;implementation{$R *.dfm}
function TClassChild1.getValue:string;
begin
  result := 'This is TClassChild1.';
end;function TClassGrandson1.getValue: string;
begin
  result := 'This is TClassGrandson1.';
end;function TClassChild2.getValue:string;
begin
  result := 'This is TClassChild2.';
end;type
  TArrayOfParent = array of TClassParent;///////////////////////////////////////////////////////////////////////////
//这里
function CreateObjects(const aClassArray : array of TClassParentClass) : TArrayOfParent;
var
  len, i : integer;
begin
  result := nil;
  len := Length(aClassArray);
  if len = 0 then
    exit;  SetLength(result, len);  for i := Low(aClassArray) to High(aClassArray) do
  begin
    result[i - Low(aClassArray)] := aClassArray[i].Create;
  end;
end;
///////////////////////////////////////////////////////////////////////////procedure TForm1.Button1Click(Sender: TObject);
var
  res : TArrayOfParent;
  i : integer;
begin
///////////////////////////////////////////////////////////////////////////
//这里调用
  res := CreateObjects([TClassChild1, TClassChild2, TClassGrandson1]);
  for i := Low(res) to High(res) do
  begin
    try
      ShowMessage(res[i].getValue);
    finally
      res[i].free;
    end;
  end;
end;end.

解决方案 »

  1.   

    在.net中没有原生的参考类(D8只不过绕了一个圈实现的〕。
    通常C#中使用成员函数GetType来得到他所对应的System.Type类型。
      

  2.   

    to Eastunfail(龍子龍孫):
    就是说,无法利用编译期类型检查了?
      

  3.   

    编译期间使用 typeof来查询
      

  4.   

    to Eastunfail(龍子龍孫):
    能否给个例子?谢了先。
      

  5.   

    举个例子。在编译期间得到Form对应的System.Type类型,然后来根据此Type来创建一个Form:
    object o=System.Activator.CreateInstance(typeof(Form));
    (o as Form).ShowDialog();
      

  6.   

    c#中
    Form func(Type v)
    {
      return System.Activator.CreateInstance(v) as form;
    }若
    Form form = func(typeof(ArrayList));则编译期无法发现错误,仅在运行期引发异常。
    有没有类似delphi的实现方式?