4

出于记录和报告的原因,我创建了具有属于异常的类名和消息的对象。我这样做是为了不必管理 Exception 对象的生命周期。我想做的是恢复 RTTI 识别的优点,它允许您使用Delphi 6 中的“ is ”运算符判断对象是否从给定类派生。

有没有办法使用字符串形式的类名来判断字符串包含的类是否派生自另一个类?

假设我有一个对象的类存储在 strClassName 中,并且该类是“derivedClass”。此外,derivedClass 是从 baseClass 派生的。有没有我可以编写的函数来判断 strClassName 中字符串形式的类是否派生自 baseClass?例如:

// Hypothetical function that returns TRUE if the class in strClassName is
//  derived from the class passed in theBaseClass
function isDerivedClass(strClassName: string; theBaseClass: TAnyClass): boolean;

该方法的主体会是什么样子?

4

1 回答 1

10
function isDerivedClass(strClassName: string; theBaseClass: TClass): boolean;
begin
  Result := FindClass(strClassName).InheritsFrom(theBaseClass);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  RegisterClass(TLabel); // must be registered to be found by FindClass/GetClass

  if isDerivedClass('TLabel', TWinControl) then
    ..


如果您不希望在找不到名为“strClassName”的类时引发异常,请使用GetClass代替FindClass

function isDerivedClass(strClassName: string; theBaseClass: TClass): boolean;
var
  aClass: TClass;
begin
  Result := False;
  aClass := GetClass(strClassName);
  if Assigned(aClass) then
    Result := aClass.InheritsFrom(theBaseClass);
end;
于 2012-05-08T01:09:18.303 回答