delphi 按Rtti划分的自由对象字段

pobjuy32  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(144)

如何在 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;
edqdpe6u

edqdpe6u1#

偏移量是相对于示例指针的。您的代码应该是:

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

你可能更喜欢使用字段对象的GetValue方法来读取字段的值,这样就避免了所有指针运算。
你在这里做的是非常有限的。所有的派生类都必须符合这个策略。所有的字段必须是对象并且必须由这个类拥有。你不能有整数字段,布尔字段等等。至少你应该只尝试破坏那些是对象的字段。
我的直觉告诉我,你的企图将被证明是行不通的。

相关问题