如何为对象执行 TRTTIProperty 的转换
How to perform a cast of a TRTTIProperty for an object
我正在 Delphi-Tokyo 学习 RTTI 以创建 ORM,但我在访问也是对象的属性时遇到问题。在下面的代码中,我如何为 id
执行 Prop
的转换?
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, rtti, Vcl.StdCtrls;
type
TIntField = class(TObject)
private
fDisplayNme: string;
public
constructor Create(DisplayName: string);
published
property DisplayName: string read fDisplayNme write fDisplayNme;
end;
TSale = class(TObject)
private
fIdSale: TIntField;
public
constructor Create;
published
property IdSale: TIntField read fIdSale write fIdSale;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TIntField }
constructor TIntField.Create(DisplayName: string);
begin
fDisplayNme:= DisplayName;
end;
{ TSale }
constructor TSale.Create;
begin
fIdSale:= TIntField.Create('idSale');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Context: TRttiContext;
TypObj: TRttiType;
Prop: TRttiProperty;
sale: TSale;
id: TIntField;
begin
sale:= TSale.Create;
Context:= TRttiContext.Create;
TypObj:= Context.GetType(sale.ClassInfo);
prop:= TypObj.GetProperty('IdSale');
id:= Prop as TIntField; //Would you like to do this or something equivalent
ShowMessage(id.DisplayName);
end;
end.
在 TRttiProperty
实例上调用 GetValue
,传递实例指针。这会产生一个 TValue
,您可以使用 AsType<T>
从中提取对象。像这样:
var
Context: TRttiContext;
Typ: TRttiType;
Prop: TRttiProperty;
sale: TSale;
id: TIntField;
....
sale := TSale.Create;
Typ := Context.GetType(sale.ClassInfo);
Prop := Typ.GetProperty('IdSale');
id := Prop.GetValue(sale).AsType<TIntField>;
Writeln(id.DisplayName);
我正在 Delphi-Tokyo 学习 RTTI 以创建 ORM,但我在访问也是对象的属性时遇到问题。在下面的代码中,我如何为 id
执行 Prop
的转换?
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, rtti, Vcl.StdCtrls;
type
TIntField = class(TObject)
private
fDisplayNme: string;
public
constructor Create(DisplayName: string);
published
property DisplayName: string read fDisplayNme write fDisplayNme;
end;
TSale = class(TObject)
private
fIdSale: TIntField;
public
constructor Create;
published
property IdSale: TIntField read fIdSale write fIdSale;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TIntField }
constructor TIntField.Create(DisplayName: string);
begin
fDisplayNme:= DisplayName;
end;
{ TSale }
constructor TSale.Create;
begin
fIdSale:= TIntField.Create('idSale');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Context: TRttiContext;
TypObj: TRttiType;
Prop: TRttiProperty;
sale: TSale;
id: TIntField;
begin
sale:= TSale.Create;
Context:= TRttiContext.Create;
TypObj:= Context.GetType(sale.ClassInfo);
prop:= TypObj.GetProperty('IdSale');
id:= Prop as TIntField; //Would you like to do this or something equivalent
ShowMessage(id.DisplayName);
end;
end.
在 TRttiProperty
实例上调用 GetValue
,传递实例指针。这会产生一个 TValue
,您可以使用 AsType<T>
从中提取对象。像这样:
var
Context: TRttiContext;
Typ: TRttiType;
Prop: TRttiProperty;
sale: TSale;
id: TIntField;
....
sale := TSale.Create;
Typ := Context.GetType(sale.ClassInfo);
Prop := Typ.GetProperty('IdSale');
id := Prop.GetValue(sale).AsType<TIntField>;
Writeln(id.DisplayName);