使用Delphi动态投射以访问方法和属性

时间:2019-01-25 15:37:55

标签: delphi rtti dynamic-cast

如何才能对创建的对象进行动态转换,以访问其方法或属性。假设对象的类非常简单,具有公共方法和属性等。

我有3个单元用于3个不同的框架,它们共享相同的程序。

unit frameTypeA;
type
  TfrmTypeA = class(TFrame)
    procedure doSomething(Sender: TObject);
end;

unit frameTypeB;
type
  TfrmTypeB = class(TFrame)
    procedure doSomething(Sender: TObject);
end;

unit frameTypeC;
type
  TfrmTypeC = class(TFrame)
    procedure doSomething(Sender: TObject);
end;

在代码的某个时刻,我根据上述所有类型动态创建了这些框架。因此,我基于TfrmTypeA或frameTypeB或frameTypeC创建一些框架。这对我的问题并不重要,但我会将所有创建的框架保留在列表中。

// frame A
frame := frameTypeA.Create(Application);
// frame B
frame := frameTypeB.Create(Application);
// frame C
frame := frameTypeC.Create(Application);

我正在尝试了解如何利用RTTI或其他Delphi机制来实现动态投射。如果我想使用简单的老式转换来执行方法,则可以执行以下操作:

TfrmTypeA(tempFrame).doSomething;

一切正常。 Delphi IDE从该框架中知道了该方法,因此我可以轻松地使用强制转换来执行该方法。

现在我的问题是: 如果我从框架中获得该类,该如何动态地转换该类并使用该方法?

var
    tempClass: TClass;

begin
    tempClass:= tempFrame.GetClass; 
end

有没有办法实现这样的目标?

tempClass(tempFrame).DoSomething;

以便delphi在设计时会知道,我正在铸造的班级中包含DoSomething吗?

0 个答案:

没有答案
相关问题