2010-12-17 106 views
5

有沒有辦法在事先不知道它們是什麼的情況下迭代D2010中的對象的成員變量?迭代成員變量

+0

您使用的是哪個版本的delphi? – RRUZ 2010-12-17 00:25:32

+0

我正在使用德爾福2010年。 – 2010-12-17 00:30:00

回答

2

是的,如果您使用的是Delphi 2010或更高版本。您可以使用擴展RTTI來獲取有關對象的字段,方法和屬性的信息。簡單的版本:

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; 

必要的對象可以在RTTI單位被發現。

在Delphi的早期版本中,有一些更有限的RTTI可以獲得關於某些屬性和方法的一些信息,但它不能做太多。

+0

方法/領域/屬性必須是「發佈」或他們可以正常? – 2010-12-17 00:44:32

+0

@John:默認情況下,爲所有字段和'public'或'published'屬性和方法生成擴展RTTI。這可以在您使用'{$ RTTI}'編譯器指令編寫的代碼中進行更改,但除非使用它們的修改版本,否則對於標準庫而言它已經非常適合了。 (這是可能的,但Embarcadero正式勸阻。) – 2010-12-17 00:56:57

+0

嗯,Borland對RTL重建非常友好,他們最近是否改變了策略? – 2010-12-17 01:34:17