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。
我正在尝试列出我的接口并 类 构建一个框架,但是 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。