2016-07-24 31 views
2

我如何可以通過在delphi(XE4)Rtti自由字段的我的對象?自由對象的字段通過Rtti

我需要釋放所有領域的動態

我能找到的領域,但現在我不,我應該如何釋放他們:

destructor TKnBase.Destroy; 
var 
    AContext: TRttiContext; 
    AField: TRttiField; 
begin 
    for AField in AContext.GetType(Self.ClassInfo).GetFields do 
    begin 
    -->free filed (AField) 
    end; 

    inherited; 
end; 

我試着用這個,但不起作用:

destructor TKnBase.Destroy; 
type 
    dp = ^TObject; 
var 
    AContext: TRttiContext; 
    AField: TRttiField; 
    p: dp; 
begin 
    for AField in AContext.GetType(Self.ClassInfo).GetFields do 
    begin 
    p := dp(NativeInt(AField) + AField.Offset); 
    TObject(p^).Free; 
    end; 

    inherited; 
end; 

回答

3

偏移量相對於實例指針。您的代碼應該是:

p := dp(NativeInt(Self) + AField.Offset); 

你可能更願意使用領域對象的GetValue方法來讀取該字段的值。所以避免所有的指針算術。

你在這裏做什麼是非常有限的。所有派生類都被迫適合這個策略。所有字段都必須是對象,並且必須屬於此類。你不能有整數字段,布爾字段等等。至少你應該試圖破壞作爲對象的場。

我的直覺告訴我,你正在試圖證明是行不通的。

+0

謝謝,我知道,但我不想用這種方法來釋放字段。這僅僅是爲了某些條件的問題。 –

+0

@ Pejman.Nik「某些條件」可能會要求你使用RTTI來摧毀東西? –

+1

另外,GetType(Self.ClassInfo).GetFields'是否也檢索所有派生字段?如果派生析構函數和基析構函數試圖釋放相同的字段,那將是危險的。也許你需要'GetType(TKnBase).GetDeclaredFields'來代替? –

相關問題