2014-02-13 1 views
4

RTTI를 사용하여 속성에 getter/setter를 바꾸고 싶습니다.delphi 속성을 수정하는 방법 RTTI로 Getter/Setter를 사용 하시겠습니까?

TPropInfo.SetProc/GetProc을 사용하여 getter setter에 액세스 할 수 있다는 것을 알고 있으며 속성에서 가상 메서드, 직접 필드 액세스 또는 정적 메서드를 사용하는지에 따라이 필드가 다른 데이터를 가리킨다는 것을 알고 있습니다.

커스텀 가상 메소드가있는 가상 메소드를 가리키는 properties setters/getters를 대체하는 데 흥미 롭습니다.

TRttiInstanceProperty(RttiProperty).PropInfo^.SetProc := ? // SomeOtherInstance.Setter 
TRttiInstanceProperty(RttiProperty).PropInfo^.GetProc := ? // SomeOtherInstance.Getter 
+3

달성하려는 목표에 가장 잘 접근하려면 먼저 가상 메소드 getter/setter를 사용하고 가상 메소드 차단을 사용해야합니다. –

답변

4

질문이 잘못된 생각을 바탕으로하므로 목표를 달성 할 수 없습니다. RTTI 정보는 컴파일 된 코드에 지정된대로 getter/setter를 제공합니다. 그러나 부동산에 접근 할 때 RTTI 정보는 참조되지 않습니다. 오히려 getter/setter가 직접 호출됩니다.

property Count: Integer read GetCount; 

당신은 게터를 구현하는 방법을 찾기 위해 RTTI이 부동산을 조회 할 수 있습니다 설명하기 위해

다음 정규 읽기 전용 속성을 고려한다. 당신이 코드에서이 쓰기 그러나 때

Writeln(Obj.Count); 

을 컴파일러는이 변환 :

Writeln(Obj.GetCount); 

하고 컴파일합니다. 콜 사이트에서 RTTI 정보는 결코 문의되지 않습니다. 따라서 RTTI 정보를 수정하려는 시도는 속성에 액세스하는 코드에 아무런 영향을 미치지 않습니다.

문제에 대한 다른 해결책을 찾아야합니다.

+0

그건 의미가 있습니다. 너무 나빴어. 하위 클래스에 정의 된 고유 한 특성 필드를 기본 클래스가 가지고 노력하고있어. 이렇게하려면 필드가 언제 바뀌는 지 알아야합니다. 나는 도청 재산이 그 일을 할 것이라고 생각했지만 분명히 그렇지 않았습니다. – monoceres

관련 문제