Проблемы с индексированием свойств через новый RTTI [D2010]

StackOverflow https://stackoverflow.com/questions/1685392

  •  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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top