Бэкпорт RTTI.TRttiIndexedProperty для Delphi XE - PullRequest
3 голосов
/ 13 марта 2012

Факты:

Успешные независимые усилия по приведению Rtti.TVirtualInterface , представленные в Delphi XE2 к предыдущим версиям Delphi, были сделаны соответственно

  • Винсент Парретт в Delphi.Mocks.VirtualInterface подразделении ( Delphi Mocks )
  • Стефан Глиенке в DSharp.Core.VirtualInterface.pas подразделении ( DSharp )

Выводы:

  • TRttiIndexedProperty является производным от TRttiMember.
  • TRttiType и TRttiInstanceType зависят от TRttiIndexedProperty.
  • зависит от Rtti.pasTypInfo.pas, где также произошли некоторые критические изменения.

Вопрос:

Есть ли надежда, что однажды кто-нибудь сделает возможнымпринести TRttiIndexedProperty на Delphi XE?

1 Ответ

6 голосов
/ 14 марта 2012

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

Единственная возможность, которую вы имеете, - это записать эти данные вручную.Таким образом, вы должны написать синтаксический анализатор, который запускает весь ваш код и генерирует необходимую информацию о типе для всех индексированных свойств.А поскольку ваш синтаксический анализатор не является компилятором, вам также придется писать небольшие вспомогательные функции, которые пишут и читают свойство indexed.Вывод может быть примерно таким:

TMyClass = class
private
  ...
public
  property MyArray[Index: Integer]: TMyObject read GetMyArray write SetMyArray;

  // autogenerated code
  class procedure RegisterIndexedPropertyInfos(Registry: TMyRttiIndexedPropertyRegistry); static;
end;

// autogenerated code
class procedure TMyClass.RegisterIndexedPropertyInfos(Registry: TMyRttiIndexedPropertyRegistry): TMyRttiIndexedProperty;
begin
  Registry.Register('MyArray', [TMyRttiIndex.Create('Index', TypeInfo(Integer))], TypeInfo(TMyObject), @TMyClass.GetMyArray, @TMyClass.SetMyArray);
end;

// When using RichRTTI you can omit this line and use the the RttiContext to find RegisterIndexedPropertyInfos
RegisterIndexedPropertyClass(TMyClass, @TMyClass.RegisterIndexedPropertyInfos);
...