使用Delphi 2010和RTTI,我知道如何获取对象的类类型以及如何获取/设置对象属性的值和类型,但是如何确定对象的属性值继承链属性从何而来?我想要使用与主类不同的基类的属性。Delphi 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'? – 2012-07-05 20:55:32
我想知道“你如何确定继承链中属性来自哪个类”或者更确切地说是TClassBase或TClassDescendant中的属性。当我遍历一个类的属性时,我想忽略基类的属性。在我的特殊情况下,我从TInterfacedObject继承了一个类,并在所有属性上执行一个函数,除非它们具有[Ignore]属性,但我也想轻松忽略来自TInterfacedObject的RefCount。 – 2012-07-05 22:59:03
而不是检查当前属性是否存在于特定的类中,检查被枚举的对象是否为预期的类会更有意义。这将更容易实施,并且更准确。 – 2012-07-05 23:06:47