2014-02-13 1 views
4

Я хотел бы заменить getter/setter для свойств с использованием RTTI.Как изменить свойство delphi Getter/Setter с RTTI?

Я знаю, что вы можете получить доступ к устройству получения с помощью TPropInfo.SetProc/GetProc, и я знаю, что эти поля указывают на разные данные, если свойство использует виртуальные методы, прямой доступ к полям или статические методы.

Я заинтересован в замене правильных сеттеров/геттеров, которые указывают на виртуальные методы с помощью пользовательских виртуальных методов.

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

Наилучший подход к тому, что вы хотите достичь, вероятно, будет иметь виртуальный геттер/сеттер в первую очередь, а затем использовать перехват виртуальных методов. –

ответ

4

Вы не можете достичь своей цели таким образом, потому что ваш вопрос основан на неправильной концепции. Информация RTTI дает вам геттер/сеттер, как указано в скомпилированном коде. Но когда вы обращаетесь к собственности, информация RTTI не запрашивается. Скорее, геттер/сеттер вызывается напрямую.

Для иллюстрации рассмотрит следующее каноническое только для чтения свойства:

property Count: Integer read GetCount; 

Вы можете запросить это свойство с RTTI, чтобы узнать метод, который реализует сорбент. Однако, когда вы пишете это в коде:

Writeln(Obj.Count); 

компилятор переводит это:

Writeln(Obj.GetCount); 

и компилирует это. На сайте вызова информация RTTI никогда не проконсультируется. Поэтому любая попытка изменить информацию RTTI не повлияет на код, который обращается к этому свойству.

Вам нужно найти другое решение вашей проблемы.

+0

Это имеет смысл. Очень жаль. Я пытаюсь иметь собственные классы, связанные с базовыми классами, определенные в подклассах. Для этого мне нужно знать, когда меняется поле. Я думал, что перехватывающие свойства будут выполнять эту работу, но, видимо, нет. – monoceres

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

  • Нет связанных вопросов^_^