Как убедиться, что RTTI доступен для класса без его создания?

Недавно я разместил на этом форуме вопросс просьбой дать какой-либо совет относительно отсутствующей информации RTTI в исполняемом файле DXE2.

Этот пост был урезанной версией моего настоящего дела. На помощь пришел RRUZ, и поэтому урезанная версия была быстро решена. Первоначальная проблема, однако, все еще актуальна, и поэтому я публикую ее полностью. "Main":

program MissingRTTI;
{$APPTYPE CONSOLE}
uses
  System.SysUtils, RTTI, MyUnit in 'MyUnit.pas', RTTIUtil in 'RTTIUtil.pas';
var
  RHelp:  TRttiHelper;
begin
  RHelp := TRttiHelper.Create();
  if (RHelp.IsTypeFound('MyUnit.TMyClass')) then WriteLn('TMyClass was found.')
  else WriteLn('TMyClass was not found.');
  ReadLn;
  RHelp.Free();
end.

RTTIUtil.pas:

unit RTTIUtil;
interface
uses
  MyUnit;
type
  TRttiHelper = class(TObject)
  public
    function IsTypeFound(TypeName: string) : boolean;
  end;
implementation
uses
  RTTI;
function TRttiHelper.IsTypeFound(TypeName: string): boolean;
var
  rCtx:   TRttiContext;
  rType:  TRttiType;
begin
  Result := false;
  rCtx := TRttiContext.Create();
  rType := rCtx.FindType(TypeName);
  if (rType <> nil) then
    Result := true;
  rCtx.Free();
end;
end.

и, наконец, MyUnit.pas:

unit MyUnit;
interface
type
  TMyClass = class(TObject)
  end;
implementation
end.

Требуемый тип не найден. Однако, если я изменю TRttiHelper.IsTypeFoundтак, чтобы он создавал (и немедленно освобождал) экземпляр TMyClass, тип будет найден. Вот так:

function TRttiHelper.IsTypeFound(TypeName: string): boolean;
var
  rCtx:   TRttiContext;
  rType:  TRttiType;
  MyObj:  TMyClass;
begin
  Result := false;
  MyObj:= TMyClass.Create();
  MyObj.Free();
  rCtx := TRttiContext.Create();
  ...

Итак, мне интересно, можно ли как-нибудь заставить RTTI создаваться для TMyClassбез фактического его создания?

Обновление:

С другой стороны, я могу упомянуть, что если я попытаюсь получить TRttiType с помощью TRttiContext.GetType, нужный тип будет найден. Таким образом, выдается некоторый RTTI. Проверка свойства TRttiType.IsPublic, полученного с помощью TRttiContext.GetType, дает истинное значение, т. е. полученный тип является общедоступным (и, следовательно, его можно найти с помощью TRttiContext.FindType). ).

7
задан Community 23 May 2017 в 12:01
поделиться