delphi TRttiField.GetValue没有给予正确的值

vdzxcuhz  于 2023-04-11  发布在  其他
关注(0)|答案(2)|浏览(132)

我用的是 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.

blpfk2vs

blpfk2vs1#

TRttiField.GetValue()函数需要传入一个指向示例的指针来获取该示例的字段值。然而,您的示例是一个对象,并且对该对象的引用已经是一个指针,因此您应该直接传递它,而不是检索指针本身的地址。
更改以下行并从调用中删除@运算符:

val := field.GetValue(testInstance).AsInteger;

另一方面,如果你的TTestRTTI是一个record而不是class,那么当你将记录示例传递给GetValue函数时,你确实需要使用@运算符:

TTestRTTI = record
  field1: integer;
end;

var testInstance: TTestRTTI;

val := field.GetValue(@testInstance).AsInteger;
pbwdgjma

pbwdgjma2#

好的,我的问题是,我把testInstance的地址直接传递给GetValue(),因为testInstance是一个类,所以这不起作用。
问题是,当使用泛型时,传递任何一个都不起作用。因此,而不是像这样的泛型过程:

procedure TMyClass.DoStuff<T>(a: T);

您需要:

procedure TMyClass.DoStuff<T>(a: Pointer);

然后可以将a直接传递给PByteGetValue

相关问题