2016-07-24 12 views
2

어떻게 무료 필드 내 개체 Rtti 델파이 (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'가 필요할까요? –