2016-07-24 13 views
2

Wie kann ich Felder meines Objekts von Rtti in Delphi (XE4) freigeben?Free Object's Field Von Rtti

Ich brauche alle Felder frei dynamisch

I Felder finden, aber ich weiß jetzt nicht, wie ich sie befreien sollte:

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; 

ich versuche, mit diesem aber nicht funktioniert:

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; 

Antwort

3

Der Offset ist relativ zum Instanzzeiger. Der Code sollte sein:

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

Sie könnten das Feld Objekt GetValue Methode verwenden möchten den Wert des Felds zu lesen. Und so vermeiden Sie all diese Zeigerarithmetik.

Was Sie hier tun, ist sehr begrenzt. Alle abgeleiteten Klassen müssen diese Richtlinie anpassen. Alle Felder müssen Objekte sein und dieser Klasse gehören. Sie können keine Integer-Felder, boolesche Felder usw. haben. Zumindest sollten Sie nur versuchen, Felder, die Objekte sind, zu zerstören.

Mein Instinkt sagt mir, dass das, was Sie versuchen, sich als unbrauchbar erweisen wird.

+0

danke, ich weiß das, aber ich will dies nicht als Ansatz für freie Felder verwenden. Es ist nur ein Problem mit bestimmten Bedingungen. –

+0

@ Pejman.Nik Welche "bestimmten Bedingungen" könnten erfordern, dass Sie auf RTTI zurückgreifen, um Dinge zu zerstören? –

+1

"GetType (Self.ClassInfo) .GetFields" ruft nicht auch alle abgeleiteten Felder ab? Das wäre gefährlich, wenn abgeleitete Destruktoren und Basisdestruktoren versuchen, die gleichen Felder zu befreien. Vielleicht brauchen Sie stattdessen 'GetType (TKnBase) .GetDeclaredFields'? –