我通过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.ClassType
在lObj as lObj.ClassParent
之后无法更改。有人可以解释为什么这不起作用并提供一些有用的东西吗?
*这似乎有效,因为它让lObj.ClassType成为父类,但它会导致问题,我后来阅读文档,发现它甚至不应该在第一个被调用的地方。
答案 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。