2016-07-24 2 views
2

Как я могу освободить поля моего объекта на Rtti в delphi (XE4)?Поле свободного объекта от 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' вместо этого? –

Смежные вопросы