TRttiContext GetTypes 找不到我的类型

TRttiContext GetTypes not finding my types

我正在尝试列出我的接口并 类 构建一个框架,但是 GetTypes () 方法找不到我的类型,我必须在我的源代码中更改什么才能使其成为可能?

unit untPrincipal;

interface

uses
   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Rtti, Vcl.StdCtrls, System.TypInfo;

type
   TForm1 = class(TForm)
      btnTeste: TButton;
      mmoSaida: TMemo;
      procedure btnTesteClick(Sender: TObject);
   private
      { Private declarations }
   public
      { Public declarations }
   end;

   IMyInterface = interface(IInterface)
      ['{60B148AA-0750-432F-8AC0-1423707803AC}']
      procedure Fazer;
   end;

   IMyInterface2 = interface(IInvokable)
      ['{80A5566A-D8A4-44A7-AEC6-7874F95EFA13}']
      procedure Fazer;
   end;

{$M+}

   IMyInterface3 = interface
      ['{7A6ED55C-2A96-4BCF-ADD1-65159B37F258}']
      procedure Fazer;
   end;
{$M-}

   TMyClass = class(TInterfacedObject, IMyInterface)
   public
      procedure Fazer;
   end;

   TMyClass2 = class(TInterfacedObject, IMyInterface2)
   public
      procedure Fazer;
   end;

   TMyClass3 = class(TInterfacedObject, IMyInterface3)
   public
      procedure Fazer;
   end;

var
   Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.btnTesteClick(Sender: TObject);
var
   ctx: TRttiContext;
   ctypes: TArray<TRttiType>;
   ctype: TRttiType;
begin
   mmoSaida.Clear;
   ctx := TRttiContext.Create;
   try
      ctypes := ctx.GetTypes();
      for ctype in ctypes do
      begin
         mmoSaida.Lines.Add(ctype.ToString)
      end;
   finally
      ctx.Free;
   end;
end;

{ TMyClass }

procedure TMyClass.Fazer;
begin
   ShowMessage('procedure TMyClass.Fazer;');
end;

{ TMyClass2 }

procedure TMyClass2.Fazer;
begin
   ShowMessage('procedure TMyClass2.Fazer;');
end;

{ TMyClass3 }

procedure TMyClass3.Fazer;
begin
   ShowMessage('procedure TMyClass3.Fazer;');
end;

end.

上面的代码列出了几种类型,包括TForm1和其他简单类型。但它既没有列出我的接口,也没有列出我的 类.

Delphi 10.3 更新 1(版本 26.0.33219.4899)

谢谢

您需要以某种方式注册类型(如工厂概念)。 对于普通的 class 工厂,您可以将 classes 添加到工厂 class 列表中。同样的方法适用于 RTTI,只有当你“使用”class.

时它才会自动添加

但是在这两种情况下,您都不希望使用 class 工厂的 routine/unit 对包含 class 的实际单元有一个 link(松散处理)。

因此,为了使这项工作有效,您可以将“TMyClass.Classname”添加到定义“TMyClass”的单元的“初始化”部分。然后Rtti就会知道了。 这样就不需要在应用程序的主要单元中“使用”class。