gpt4 book ai didi

delphi - 通过RTTI记录字段中的值

转载 作者:行者123 更新时间:2023-12-03 03:40:00 25 4
gpt4 key购买 nike

我们需要使用带有预设值的 rtti 创建一个类。这些值取自属性。当您需要在该领域增加值(value)时,一切看起来都很好。找到正确的属性并获取该属性的值为true。但记录并没有被操作。告诉我哪里错了?

program DemoGenerator;
{$APPTYPE CONSOLE}
{$R *.res}

uses
System.SysUtils,
System.Rtti;

Type
// My attribute
DemoDataAttribute = class(TCustomAttribute)
private
FGenerator: String;
public
constructor Create(Generator: String);
published
property Generator: string read FGenerator write FGenerator;
end;

//
TSomeType = Class
private
fPhone: string;
published
[DemoData('+1800764328')]
property Phone: string read fPhone write fPhone;
End;

//
TMegaSuperClass = Class
Function Go<T: Class, constructor>: T;
End;

Procedure Test;
var
LMsc: TMegaSuperClass;
New: TSomeType;
Begin
LMsc := TMegaSuperClass.Create;
try
New := LMsc.Go<TSomeType>;
Writeln('New.Phone: ' + New.Phone);
finally
LMsc.Free;
// New.Free;
end;
End;

{ DemoDataAttribute }

constructor DemoDataAttribute.Create(Generator: String);
begin
FGenerator := Generator;
end;

{ TMegaSuperClass }

function TMegaSuperClass.Go<T>: T;
var
LContext: TRttiContext;
LClass: TRttiInstanceType;
LProp: TRttiProperty;
LAttr: TCustomAttribute;
LField: TRttiField;
begin
// Init Rtti
LContext := TRttiContext.Create;
LClass := LContext.GetType(T) as TRttiInstanceType;
Writeln('LClass: ' + LClass.ToString);
// Result
Result := T.Create;
for LProp in LClass.GetProperties do
begin
Writeln('LProp: ' + LProp.ToString);
for LAttr in LProp.GetAttributes do
begin
Writeln('LAttr: ' + LAttr.ToString);
if LAttr is DemoDataAttribute then
Begin
Writeln('Attr value: ' + DemoDataAttribute(LAttr).Generator);
// How write value?
LProp.SetValue(@Result, DemoDataAttribute(LAttr).Generator);
End;
end;
end;
end;

begin
try
{ TODO -oUser -cConsole Main : Insert code here }
Test;
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;

end.

控制台输出:

TSomeType
property Phone: string
DemoDataAttribute
value: +1800764328
Phone:

最佳答案

像这样:

LProp.SetValue(Pointer(Result), DemoDataAttribute(LAttr).Generator);

SetValue 的第一个参数声明为 Instance: Pointer。类引用只是指向实例的指针,这正是您想要的。

关于delphi - 通过RTTI记录字段中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42373866/

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