2010-09-12 17 views
9

¿Hay alguna manera de explorar las propiedades de una interfaz con Rtti?Delphi Rtti: Explore las propiedades de las interfaces?

El código siguiente no funciona:

procedure ExploreProps; 
var 
    Ctx: TRttiContext; 
    RttiType: TRttiType; 
    RttiProp: TRttiProp; 
begin 
    RttiType := Ctx.GetType(TypeInfo(IMyInterface)); 
    for RttiProp in RttiType.GetProperties do 
    Writeln(RttiProp.ToString); 
end; 

Alguien ha una solución de cómo hacer esto correctamente?

Respuesta

4

Las interfaces son colecciones de funciones. Realmente no tienen propiedades como lo hacen los objetos; eso es solo un poco de azúcar sintáctica que el compilador agrega para que sea más fácil escribir código para ellos. La diferencia es que en los objetos, las propiedades permiten el acceso controlado a miembros privados y protegidos, mientras que en las interfaces, todos los miembros son públicos, por lo que no hay necesidad de las propiedades.

+0

Ok, pero la exploración de un métodos de interfaces no funciona bien ... Justo reemplazó el ciclo for utilizando RttiType.GetMethods, todavía no hay resultados. –

+4

@Christian: Acabo de ver el código del sistema RTTI, y muchas interfaces en las bibliotecas estándar están configuradas sin RTTI generado para ellas. No estoy seguro de cuáles son las reglas para generar RTTI extendido para tipos de interfaz, ya que parece ser diferente de generar RTTI extendido para clases o registros. ¿Tal vez Barry Kelly o Allen Bauer podrían responder este? –

+0

Un tipo de interfaz debe tener '{M +}' aplicado para que 'TRttiType.GetMethods()' informe los métodos de la interfaz. –

1

Como sabía, no hay soporte para interfaces normales. Puedes agregar {$ M +} y luego intentarlo de nuevo.

-1

respuesta tardía, pero podría encasillar su interfaz a TObject, p. Ej.

RttiType := Ctx.GetType(TObject(IMyInterface).ClassInfo); 
+0

Eso es incorrecto y peligroso. Debido a las interfaces de diseño de memoria, no se pueden devolver a los objetos. Debería agregar una función a la interfaz para regresar al objeto (como en la respuesta de @FLICKER). –

2

Agregar esta función en su interfaz

function GetObject: TObject; 

e implementarlo en la clase. el uso de la función GetObject con RTTI rutinas

var 
    obj: IPerson; 
begin 
    obj := TPerson.Create; 
    Count := GetPropList(obj.GetObject.ClassInfo, tkAny, @List); 
end; 

Tenga en cuenta que su clase debe ser heredada de TInterfacedPersistent no TInterfacedObject

TPerson = class(TInterfacedPersistent, IPerson) 
Cuestiones relacionadas