2008-10-03 88 views
2

我想在Delphi中解析對象到XML,所以我讀了關於調用對象的ClassInfo方法來獲取其RTTI信息。德爾福在對象RTTI

事情是,這顯然只適用於TPersistent對象。否則,我必須專門爲編譯器的源代碼添加一個編譯器指令{$ M +}來生成RTTI信息。

所以我很高興地添加了指令,發現即使它從ClassInfo調用中返回了一些東西(它用於返回nil),現在我無法從中檢索類的屬性,字段或方法。就像它創建了空的對象。

任何想法我在這裏想念什麼?謝謝!

回答

7

您是否已將這些屬性和方法放入published部分?

除此之外,'classic'RTTI($ TYPEINFO ON)只會爲您提供有關屬性的信息,而不是方法。你需要'擴展'RTTI($ METHODINFO ON)。

很好的出發點擴展RTTI:David Glassborow on extended RTTI

(誰也不會相信眼前這個分我寫完使用擴展RTTI一些代碼,並決定瀏覽堆棧溢出的一點:))

+0

謝謝,那必須是問題所在。我把這些物業放在公衆面前,而不是公佈的部分。 我必須等待星期一去嘗試,因爲我在工作時做了Delphy,而且我已經在週末回家了。 – 2008-10-03 20:13:34

3

RTTI只會告訴你已發佈屬性等。 - 不只是公開的。

用TObject試試你的代碼,看看會發生什麼 - 如果這不起作用,發佈你的代碼因爲不是每個人都是精神病。

+0

這就是問題所在,我的房產只是公開的,沒有公佈。 週一我回到工作時會試試。謝謝! – 2008-10-03 20:14:44

+2

delphi中的經典RTTI顯示PUBLISHED屬性,「new extended RTTI」實際上可以看到所有內容,但需要最新的Delphi版本(2010/XE或更高版本)。 – 2011-07-01 13:52:40

3

有無你考慮過使用TXMLDocument組件?它會查看你的XML,然後創建一個很好的代表你的XML文件的Delphi類的單元 - 使它真的很容易讀寫XML文件。

0

至於只返回nil的RttiType問題,這可能是因爲一個原因:在你的測試中,你沒有在任何時候實例化類。編譯器,因爲它從來沒有對這個類的引用(因爲它根本不是一個實例),只是將它從信息中作爲一種優化形式移除。看下面的兩個例子。當你在你的代碼中的某個點實例化類時,行爲是不同的。

假設下面的類:

type 
    TTest = class 
    public 
    procedure Test; 
    end; 

和下面的下面的代碼:

var 
    LContext: TRttiContext; 
    LType: TRttiType; 
    LTest: TTest; 
begin 
    LContext := TRttiContext.Create; 
    for LType in LContext.GetTypes do 
    begin 
    if LType.IsInstance then 
    begin 
     WriteLn(LType.Name); 
    end; 
    end; 
end; 

到目前爲止,t檢驗類的信息是不能供RTTI使用。然而,當我們在某個點上創建,在應用程序中,然後引用爲它創建了編譯,這使得提供這些信息中:

var 
    LContext: TRttiContext; 
    LType: TRttiType; 
    LTest: TTest; 
begin 
    LTest := TTest.Create; //Here i´m using TTest. 
         //Could be in another part of the program 

    LContext := TRttiContext.Create; 
    for LType in LContext.GetTypes do 
    begin 
    if LType.IsInstance then 
    begin 
     WriteLn(LType.Name); 
    end; 
    end; 
end; 

在這一點上,如果你使用LContext.FindType(」 TTest'),不會有零返回,因爲編譯器會一直引用該類。這解釋了您在測試中的行爲。