【发布时间】:2012-07-06 05:24:39
【问题描述】:
使用 Delphi 2010 和 RTTI,我知道如何获取对象的类类型以及如何获取/设置对象属性的值和类型,但是如何确定属性来自继承链中的哪个类?我想以不同于主类的方式使用基类的属性。
考虑这段代码:
TClassBase = class(TObject)
published
property A: Integer;
end;
TClassDescendant = class(TClassBase)
published
property B: Integer;
end;
procedure CheckProperties(Obj: TObject);
var
ctx: TRttiContext;
objType: TRttiType;
Prop: TRttiProperty;
begin
ctx := TRttiContext.Create;
objType := ctx.GetType(Obj.ClassInfo);
for Prop in objType.GetProperties do begin
if Prop.GetClassType is TClassBase then
// do something special with base class properties
else
// standard functionality on all other properties
end;
end;
问题是属性没有 GetClassType。 ClassType 只返回 TRttiInstancePropertyEx 而不是属性所属的类的名称。
【问题讨论】:
-
你的问题有点混乱。请清除。你到底在找什么?您是否试图确定
Obj.PropertyName返回的对象是TClassBase实例还是TClassDescendant实例?或者您是否试图确定Obj.PropertyName本身是否被声明为TClassBase而不管返回的对象实例实现什么类类型?您正在检查的对象如何使用TClassBase和TClassDescendant? -
我想知道“你如何确定属性来自继承链中的哪个类”或者更确切地说是 TClassBase 或 TClassDescendant 中的属性。当我遍历一个类的属性时,我想忽略基类属性。在我的特殊情况下,我从 TInterfacedObject 继承了一个类,并对所有属性执行函数,除非它们具有 [Ignore] 属性,但我也想轻松忽略 TInterfacedObject 中的 RefCount。
-
与其检查当前属性是否存在于特定类中,不如检查被枚举的对象是否是预期的类更有意义。这将更容易实施并且更准确。
-
@RemyLebeau,不,我正在使用 TClassDescendant 并遍历它的属性,但由于它继承了 TClassBase,因此它带来了这些属性。在查看所有属性时,我不知道如何确定属性属于哪个类。我需要忽略 TInterfacedObject 中声明的所有属性。
标签: delphi properties delphi-2010 rtti