Delphi Rtti: изучить свойства интерфейсов? - PullRequest
9 голосов
/ 12 сентября 2010

Есть ли способ изучить свойства интерфейса с помощью Rtti?

Следующий код не работает:

procedure ExploreProps;
var
  Ctx: TRttiContext;
  RttiType: TRttiType;
  RttiProp: TRttiProp;
begin
  RttiType := Ctx.GetType(TypeInfo(IMyInterface));
  for RttiProp in RttiType.GetProperties do
    Writeln(RttiProp.ToString);
end;

У кого-нибудь есть решение, как это правильно сделать?

Ответы [ 4 ]

5 голосов
/ 12 сентября 2010

Интерфейсы - это наборы функций. У них действительно нет свойств, как у объектов; это всего лишь немного синтаксического сахара, который добавляет компилятор, чтобы вам было легче писать код для них. Разница заключается в том, что в объектах свойства позволяют контролировать доступ к закрытым и защищенным элементам, тогда как в интерфейсах все элементы являются открытыми, поэтому в свойствах нет необходимости.

1 голос
/ 06 декабря 2012

Добавьте эту функцию в ваш интерфейс

function GetObject: TObject;

и реализуйте ее в классе.использование функции GetObject с процедурами RTTI

var
  obj: IPerson;
begin
  obj := TPerson.Create;
  Count := GetPropList(obj.GetObject.ClassInfo, tkAny, @List);
end;

Обратите внимание, что ваш класс должен наследоваться от TInterfacedPersistent not TInterfacedObject

TPerson = class(TInterfacedPersistent, IPerson)
1 голос
/ 13 сентября 2010

Как я знаю, нет поддержки нормальных интерфейсов. Вы можете добавить {$ M +} и повторить попытку.

0 голосов
/ 20 января 2011

запоздалый ответ, но вы можете ввести свой интерфейс к TObject, например,

RttiType := Ctx.GetType(TObject(IMyInterface).ClassInfo);
...