Получить подчиненное свойство компонента в Delphi, используя RTTI

Я хотел бы получить доступ к следующему свойству, используя RTTI

MyComponent1.Property['variable'].SubProperty

Я хотел бы что-то вроде этого:

var
  Ctx: TRttiContext;
  Typ: TRttiType;
  SubTyp: TRttiType;
  Prop: TRttiProperty;
  SubProp: TRttiProperty;
begin
  Ctx:= TRttiContext.Create;
  Typ:= Ctx.GetType(MyComponent1.ClassInfo);
  Prop:= Typ.GetProperty('Property['variable'].Subproperty') //not possible
  Prop.SetValue(MyComponent1.Property['variable'],'500');
end;

По сути, я хочу получить доступ к вложенному свойству моего компонента, и у меня есть только строки, поэтому я не могу использоватьTyp:=Ctx.GetType(MyComponent1.ClassInfo) а потомProp:=Typ.GetProperty('Property['variable'].Subproperty') это не разрешено Внимание в том, что есть параметр для первого свойства. Я думаю, мне нужно получить это первое свойство, а затем каким-то образом второе свойство, потому что я не могу использовать это свойство1 "."свойство2

Кто-нибудь знает как это сделать?

 David Heffernan06 июн. 2013 г., 08:32
Вы можете удалить строки TRttiContext.Create и Ctx.Free
 Felipe05 июн. 2013 г., 22:20
Моя цель - установить значение для SubProperty, например:MyComponent1.Property['variable'].SubProperty Но в моем коде у меня много компонентов и свойств, поэтому я должен сначала проверить MyComponent, а затем получить свойство Property ['переменная»], а затем как-то я хотел бы изменить SubProperty, но я не могу использоватьsubProp:= Prop.getProperty или жеTyp.getProperty('Property['variable'].subProperty')
 Felipe06 июн. 2013 г., 09:27
По сути, я хочу получить доступ к вложенному свойству моего компонента, и у меня есть только строки, поэтому я не могу использоватьTyp:=Ctx.GetType(MyComponent1.ClassInfo) а затем опора: =Typ.GetProperty('Property['variable'].Subproperty') это не разрешено Внимание в том, что есть параметр для первого свойства. Я думаю, мне нужно получить это первое свойство, а затем каким-то образом второе свойство, потому что я не могу использовать это свойство1 "."свойство2
 David Heffernan06 июн. 2013 г., 08:33
Я тоже неЯ действительно не понимаю ваш вопрос.
 whosrdaddy05 июн. 2013 г., 22:04
Можете ли вы подробнее рассказать о том, что вы действительно пытаетесь достичь здесь? Я подозреваю, что окончательный ответ будет рекурсией :)

Ответы на вопрос(1)

Свойства индекса как и все другие свойства (кроме прямых ссылок на поля объекта) просто ярлык дляgetXXX а такжеsetXXX методы.

Попробуйте так:

Получить все проиндексированные свойстваCtx.GetType(MyComponent1.ClassInfo) сGetDeclaredIndexedProperties или жеGetIndexedProperties

Поиск желаемыйProperty в возвращенном массивеTRttiIndexedProperty экземпляров.

Получить объект описания метода записи изWriteMethod собственностьюTRttiIndexedProperty объект найден

Получить описание параметров метода, если вам это нужно сGetParameters вызов.

ВызовInvoke метод объекта описания метода с созданным списком параметров для установки значения свойства.

Обновить

Это работает только в версиях Delphi от XE2 и выше.

В предыдущих версиях индексированные свойства могут быть приняты для RTTI только с использованием таких вещей, как описано вэтот вопрос.

 Felipe05 июн. 2013 г., 22:40
Не могли бы вы дать немного кода для этого? Я совершенно запутался, как это сделать ...
 ThinkJet05 июн. 2013 г., 23:29
Какую версию Delphi вы используете? RTTI поддержка индексированных свойств существует только с XE2 ...
 Felipe05 июн. 2013 г., 23:48
Да, у меня есть только строки, и я хотел бы получить доступ к свойству, но у меня возникает проблема, когда свойство находится внутри другого свойства.
 ThinkJet05 июн. 2013 г., 23:39
Другое дело, что я могу неправильно понять ваш вопрос. Вы имели в виду, что хотите получить доступ к значению внутреннего свойства, указав только строку, описывающую путь доступа к внутреннему свойству?
 Felipe05 июн. 2013 г., 23:37
У меня Delphi версия 2010
 ThinkJet05 июн. 2013 г., 23:56
Если индексированные свойства, как в вашем примере, не являются проблемой для вашей задачи, и вы можете их игнорировать, просто используйте рекурсивную функцию, чтобы шаг за шагом достичь желаемого уровня.

Ваш ответ на вопрос