2010-12-17 19 views
5

Czy istnieje sposób na iterowanie zmiennych składowych obiektu w D2010 bez wcześniejszej wiedzy o tym, co jest przed nimi?Zmienne członów Iterate

+0

której wersji delphi używasz? – RRUZ

+0

Używam Delphi 2010. –

Odpowiedz

2

Tak, jeśli używasz Delphi 2010 lub nowszego. Możesz użyć rozszerzonego RTTI, aby uzyskać informacje o polach, metodach i właściwości obiektu. Prosta wersja:

procedure GetInfo(obj: TObject); 
var 
    context: TRttiContext; 
    rType: TRttiType; 
    field: TRttiField; 
    method: TRttiMethod; 
    prop: TRttiProperty; 
begin 
    context := TRttiContext.Create; 
    rType := context.GetType(obj.ClassType); 
    for field in rType.GetFields do 
    ;//do something here 
    for method in rType.GetMethods do 
    ;//do something here 
    for prop in rType.GetProperties do 
    ;//do something here 
end; 

Niezbędne obiekty można znaleźć w jednostce RTTI.

We wcześniejszych wersjach Delphi istnieje bardziej ograniczony RTTI, który może dostarczyć informacji o niektórych właściwościach i metodach, ale nie może zrobić tak wiele.

+0

Czy metody/pola/właściwości muszą być "opublikowane" czy mogą być normalne? –

+0

@John: Domyślnie dla wszystkich pól generowane jest rozszerzone RTTI oraz właściwości i metody "public" lub "published". Można to zmienić w kodzie, który piszesz, używając dyrektywy kompilującej '{$ RTTI}', ale jest dość zapiekanka dla standardowych bibliotek, chyba że używasz ich zmodyfikowanych wersji. (Który jest możliwy, ale oficjalnie zniechęcony przez Embarcadero.) –

+0

Hmm, Borland był bardzo przyjazny dla odbudowy RTL, czy ostatnio zmienili politykę? –

Powiązane problemy