我用的是 Delphi 10.3。
TTestRTTI = class
field1: integer;
end;
procedure testRTTI();
var
field : TRttiField;
fields: TArray<TRttiField>;
testInstance: TTestRTTI;
val: Integer;
begin
testInstance := TTestRTTI.Create();
testInstance.field1 := 5;
fields := TRttiContext.Create().GetType(TypeInfo(TTestRTTI)).GetFields();
for field in fields do begin
val := field.GetValue(@testInstance).AsInteger;
end;
// val is not 5 ?
OutputDebugString(PChar(val.ToString()));
end;
GetValue似乎没有返回正确的信息。我做错了什么?
编辑:看来 Delphi 返回一个Long而不是一个Integer?这是一个平台问题?我在Windows 10 64 bits.
2条答案
按热度按时间blpfk2vs1#
TRttiField.GetValue()
函数需要传入一个指向示例的指针来获取该示例的字段值。然而,您的示例是一个对象,并且对该对象的引用已经是一个指针,因此您应该直接传递它,而不是检索指针本身的地址。更改以下行并从调用中删除
@
运算符:另一方面,如果你的
TTestRTTI
是一个record
而不是class
,那么当你将记录示例传递给GetValue
函数时,你确实需要使用@
运算符:pbwdgjma2#
好的,我的问题是,我把
testInstance
的地址直接传递给GetValue()
,因为testInstance
是一个类,所以这不起作用。问题是,当使用泛型时,传递任何一个都不起作用。因此,而不是像这样的泛型过程:
您需要:
然后可以将
a
直接传递给PByte
或GetValue
。