gpt4 book ai didi

delphi - 如何对对象执行 TRTTIProperty 的转换

转载 作者:行者123 更新时间:2023-12-01 22:08:47 25 4
gpt4 key购买 nike

我正在 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.

最佳答案

调用GetValue关于TRttiProperty实例,传递实例指针。这会产生 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 - 如何对对象执行 TRTTIProperty 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44885924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com