2010-09-12 13 views
9

Czy istnieje sposób na poznanie właściwości interfejsu za pomocą Rtti?Delphi Rtti: Przeglądaj właściwości interfejsów?

Poniższy kod nie działa:

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; 

Czy ktoś rozwiązanie jak to zrobić poprawnie?

Odpowiedz

4

Interfejsy to kolekcje funkcji. Nie mają właściwości tak jak obiekty; to tylko trochę syntaktycznego cukru, który kompilator dodaje, aby ułatwić pisanie dla nich kodu. Różnica polega na tym, że w obiektach właściwości umożliwiają kontrolowany dostęp do prywatnych i chronionych członków, podczas gdy na interfejsach wszyscy członkowie są publiczni, więc nie ma potrzeby korzystania z właściwości.

+0

Ok, ale odkrywanie interfejsy metod nie działa albo ... Tylko zamieniła pętlę for za pomocą metody RttiType.GetMethods, nadal nie uzyskała żadnych wyników. –

+4

@ Chrześcijanin: Po prostu spojrzałem na kod systemu RTTI i wiele interfejsów w standardowych bibliotekach zostało skonfigurowanych bez wygenerowanego dla nich RTTI. Nie jestem pewien, jakie reguły są dla generowania rozszerzonego RTTI dla typów interfejsów, ponieważ wydaje się być inny niż generowanie rozszerzonego RTTI dla klas lub rekordów. Może Barry Kelly lub Allen Bauer mogliby odpowiedzieć na to pytanie? –

+0

Typ interfejsu musi mieć "{M +}" zastosowany do niego, aby 'TRttiType.GetMethods()' zgłosić metody interfejsu. –

1

Jak wiadomo, nie ma obsługi normalnych interfejsów. Możesz dodać {$ M +}, a następnie spróbować ponownie.

-1

późna odpowiedź, ale możesz wpisać swój interfa na TObject, np.

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

To jest nieprawidłowe i niebezpieczne. Ze względu na układy pamięci interfejsów nie można odsyłać do obiektów. Musiałbyś dodać funkcję do interfejsu, aby powrócić do obiektu (jak w odpowiedzi @FLICKERs). –

2

Dodaj tę funkcję w interfejsie

function GetObject: TObject; 

i wdrożyć go w klasie. wykorzystanie funkcji GetObject z RTTI rutyny

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

Należy pamiętać, że klasa powinna być dziedziczone od TInterfacedPersistent nie TInterfacedObject

TPerson = class(TInterfacedPersistent, IPerson) 
Powiązane problemy