2011-12-08 10 views
12

Necesito obtener una lista de tipos de formularios, pero solo para los tipos derivados de una base determinada.¿Cómo obtener la lista de clases derivadas de una clase determinada, con RTTI mejorado?

utilizo Delphi 2010 y mejorada RTTI para navegar tipos

Mi código actual es:

rc := TRTTIContext.Create; 
rtyps := rc.GetTypes; 
for rtyp in rtyps do 
begin 
    if not(rtyp.IsInstance) then Continue; 

    // Now I need to check if rtyp.AsInstance.MetaclassType is derived from TMyBaseForm 
end; 

no quiero instanciar un objeto y utilizar el operador 'es', ya que no se ejecutaría de una manera oportuna.
Como solución actual, que prueba si un método, introducido en TMyBaseForm, se encontró en el contexto de RTTI:

if (rtyp.GetMethod('MyMethod') = nil) then Continue; 

pero esto no es una solución limpia, ya que puede conducir a la cuestión si un método con el el mismo nombre fue introducido en otra rama de clase.

Por lo tanto, mi pregunta: ¿hay una manera regular de detectar si un tipo de clase se deriva de otro tipo de clase?

Gracias,

+2

No sé cómo implementarlo usando RTTI, pero está la función [ClassParent] (http://docwiki.embarcadero.com/VCL/en/System.TObject.ClassParent). Devuelve el tipo del antecesor inmediato de una clase. O si necesita averiguar si un tipo de clase u objeto en particular es una instancia de una clase o uno de sus descendientes, use [InheritsFrom] (http://docwiki.embarcadero.com/VCL/en/System.TObject.InheritsFrom) función. – TLama

Respuesta

13

Cuando se llama a los AsInstance devuelve un TRttiInstanceType, desde allí se debe acceder a la wich MetaclassType propiedad es una referencia TClass al tipo reflejada, por último mediante el TClass puede llamar a la InheritsFrom función

for rtyp in rtyps do 
if (rtyp.TypeKind=tkClass) and rtyp.IsInstance and rtyp.AsInstance.MetaclassType.InheritsFrom(TMyBaseForm) then 
begin 

    // do something 
end; 
+3

Dios mío, me perdí este método de TClass ... simplemente un mal día o una necesidad de tomar un café, supongo. Gracias por su respuesta – user315561

+2

+1 @ user315561 café siempre funciona! (: – ComputerSaysNo

+1

+1 para 'AsInstance' –

Cuestiones relacionadas