使用RTTI在Delphi中获取组件的子属性

时间:2013-06-05 19:22:24

标签: delphi properties components 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“。”property2
有谁知道怎么做?

1 个答案:

答案 0 :(得分:0)

索引属性作为所有其他属性(对象字段的直接引用除外)只是getXXXsetXXX方法的快捷方式。

尝试这种方式:

  1. 使用GetDeclaredIndexedPropertiesGetIndexedProperties

  2. 获取Ctx.GetType(MyComponent1.ClassInfo)的所有索引属性
  3. 在返回的TRttiIndexedProperty个数组中搜索所需的Property

  4. 从找到TRttiIndexedProperty对象的WriteMethod属性获取写方法描述对象。

  5. 如果您需要GetParameters调用,请获取方法参数说明。

  6. 使用构造参数列表调用方法描述对象的Invoke方法来设置属性值。

  7. <强>更新

    这仅适用于XE2及更高版本的Delphi版本。

    在以前的版本中,只能使用this question中讨论的内容为RTTI采用索引属性。