Utilizando Delphi 2010 y RTTI, sé cómo obtener el tipo de clase de un objeto y cómo obtener/establecer el valor y tipo de las propiedades de un objeto, pero ¿cómo se determina qué clase en el cadena de herencia de donde vino una propiedad? Quiero usar las propiedades de una clase base de forma diferente que la clase principal.Delphi RTTI: Obtener clase de propiedad
consideran este código:
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;
El problema es que no hay GetClassType de las propiedades. ClassType simplemente devuelve TRttiInstancePropertyEx en lugar del nombre de la clase a la que pertenece la propiedad.
Tu pregunta es un poco confusa. Por favor, aclarar. ¿Que es exactamente lo que está buscando? ¿Estás tratando de determinar si 'Obj.PropertyName' devuelve un objeto que es una instancia' TClassBase' contra una instancia 'TClassDescendant'? ¿O está tratando de determinar si 'Obj.PropertyName' se declara como' TClassBase' independientemente del tipo de clase que implemente la instancia del objeto devuelto? ¿Cómo se usan 'TClassBase' y' TClassDescendant' para los objetos que está comprobando? –
Quiero saber "cómo se determina en qué clase de la cadena de herencia proviene una propiedad" o más bien es la propiedad en TClassBase o en TClassDescendant. Como estoy atravesando las propiedades de una clase, quiero ignorar las propiedades de la clase base. En mi situación particular, he descendido una clase de TInterfacedObject y estoy realizando una función en todas las propiedades a menos que tengan un atributo [Ignore], pero también deseo ignorar fácilmente RefCount from TInterfacedObject. –
En lugar de verificar si la propiedad actual existe en una clase específica, tendría más sentido verificar si el objeto enumerado es la clase deseada o no. Eso sería mucho más fácil de implementar y más preciso. –