在运行时将对象转换为其父对象

时间:2014-03-20 16:56:12

标签: delphi casting rtti

我通过TObject。我知道这个对象来自TBaseClass。我想要做的是显示每个班级的所有已发布属性,直到TBaseClass。可能有更好的方法来做到这一点,但我正在尝试的是:

lObj := aObject;
while lObj.ClassType <> TBaseClass do
begin
  lRttiType := lRttiContext.GetType(aObject.ClassType);
  lProps := lRttiType.GetDeclaredProperties;

  lStartIdx := Length(lAllProps);
  SetLength(lAllProps, Length(lAllProps) + Length(lProps));

  for I := Low(lProps) to High(lProps) do
    lAllProps[lStartIdx + I] := lProps[I];

  lObj := lObj as lObj.ClassParent;
  // lObj := lObj.ClassParent.InitInstance(lObj); // *see below
end;

此代码存在的问题是lObj.ClassTypelObj as lObj.ClassParent之后无法更改。有人可以解释为什么这不起作用并提供一些有用的东西吗?

*这似乎有效,因为它让lObj.ClassType成为父类,但它会导致问题,我后来阅读文档,发现它甚至不应该在第一个被调用的地方。

2 个答案:

答案 0 :(得分:5)

您不需要迭代类层次结构并使用GetDeclaredProperties - GetProperties已经为您执行此操作。

for lProp in lRttiType.GetProperties do
  if prop.Parent.AsInstance.MetaclassType = TBaseClass then
    Break;

答案 1 :(得分:3)

你只需要创建一个类类型的循环。

lObj := aObject.ClassType;
while ....
  ...
  lObj := lObj.ClassParent;  
end;

请参阅文档以获取示例:ClassParent