Как изменить свойство delphi Getter / Setter с помощью RTTI?



Я хотел бы заменить геттер / сеттер для свойств с помощью RTTI.



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



Мне интересно заменить свойства setters / getters, которые указывают на виртуальные методы, пользовательскими виртуальными методами.



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

1 ответ:

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

Для иллюстрации рассмотрим следующее каноническое свойство только для чтения:
property Count: Integer read GetCount;

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

Writeln(Obj.Count);

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

Writeln(Obj.GetCount);

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

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

Comments

    Ничего не найдено.