Как изменить свойство delphi Getter / Setter с помощью RTTI?
Я хотел бы заменить геттер / сеттер для свойств с помощью RTTI.
Я знаю, что вы можете получить доступ к сеттеру геттера с помощью TPropInfo.SetProc / GetProc и я знаем, что эти поля указывают на разные данные в зависимости от того, использует ли свойство виртуальные методы, прямой доступ к полю или статические методы.
Мне интересно заменить свойства setters / getters, которые указывают на виртуальные методы, пользовательскими виртуальными методами.
TRttiInstanceProperty(RttiProperty).PropInfo^.SetProc := ? // SomeOtherInstance.Setter
TRttiInstanceProperty(RttiProperty).PropInfo^.GetProc := ? // SomeOtherInstance.Getter
1 ответ:
Вы не можете достичь своей цели таким образом, потому что ваш вопрос основан на неправильной концепции. Информация RTTI дает вам геттер / сеттер, как указано в скомпилированном коде. Но когда вы получаете доступ к свойству, информация RTTI не запрашивается. Скорее геттер / сеттер вызывается непосредственно.
Для иллюстрации рассмотрим следующее каноническое свойство только для чтения:property Count: Integer read GetCount;Вы можете запросить это свойство с помощью RTTI, чтобы узнать метод, реализующий геттер. Однако когда вы пишете это в коде:
Writeln(Obj.Count);Компилятор переводит это в:
Writeln(Obj.GetCount);И компилирует это. На месте вызова с информацией RTTI никогда не обращаются. Таким образом, любая попытка изменить информацию RTTI не будет иметь никакого влияния на код, который обращается к свойству.
Вам нужно найти другое решение вашей проблемы.
Comments