Проблемы с индексированием свойств через новый RTTI [D2010]
-
18-09-2019 - |
Вопрос
ShowMessage(TRttiContext.Create.GetType(TStringList)
.GetProperty('Strings').ToString);
Приведенный выше код не работает, поскольку .GetProperty возвращает ноль для таких свойств, как «Строки», «Объекты», «Значения» (те, которые имеют индексаторы).Я предполагаю, что это известное ограничение, и вопрос в том, есть ли какой-либо способ получить доступ к этим индексированным свойствам (желательно без возврата к старым утилитам RTTI).
Решение
Индексированные свойства не имеют RTTI, но базовые поля имеют.Таким образом, вы можете получить доступ к TStringList.FList напрямую через RTTI.Однако будьте осторожны, так как здесь используются необработанные указатели, и убедитесь, что вы не выходите за пределы свойства Count.Вы можете делать аналогичные вещи с другими классами.
Другие советы
В RTTI есть пробелы.Индексированные свойства являются одним из них.
Но если вы не получили имя свойства, зачем вы пытаетесь получить к нему доступ?;-) Если вы знаете, что такое свойство существует, вы можете вместо этого попробовать приведение типов.
Вы не получаете RTTI для параметров метода типа
procedure MyProc(const AParam: array of AType)
также.
Кто-нибудь знает больше элементов, в которых мы не можем получить RTTI?