2016-07-24 60 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'来代替? –

相关问题