Delphi:如何获取静态记录的地址

Delphi:如何获取静态记录的地址,delphi,static,record,rtti,getvalue,Delphi,Static,Record,Rtti,Getvalue,但是,我在上遇到一个编译器错误GetValue@TMyRecord-预期为E2029,但已找到 通常应使用记录的“实例”地址调用GetValue。但在这种情况下,记录是静态的。 我不想将此记录转换为普通记录、创建实例等。我正在尝试为静态记录解决此问题。 如何获取应该传递给GetValue的地址?据我所知,类字段无法通过RTTI访问。据我所知,类字段无法通过RTTI访问。如另一个答案所述,使用RTTI访问类变量字段是不可能的 但只要稍作调整,仍有可能获得想要的解决方案: TMyRecord

但是,我在上遇到一个编译器错误GetValue@TMyRecord-预期为E2029,但已找到

通常应使用记录的“实例”地址调用GetValue。但在这种情况下,记录是静态的。 我不想将此记录转换为普通记录、创建实例等。我正在尝试为静态记录解决此问题。
如何获取应该传递给GetValue的地址?

据我所知,类字段无法通过RTTI访问。

据我所知,类字段无法通过RTTI访问。

如另一个答案所述,使用RTTI访问类变量字段是不可能的

但只要稍作调整,仍有可能获得想要的解决方案:

    TMyRecord
    MyField1: string = Hello, world!
    MyField2: integer = 123;
    MyField3: extended = 3.1415927;

正如在另一个答案中所说的,使用RTTI访问类var字段是不可能的

但只要稍作调整,仍有可能获得想要的解决方案:

    TMyRecord
    MyField1: string = Hello, world!
    MyField2: integer = 123;
    MyField3: extended = 3.1415927;

感谢陆路的贡献!非常聪明,使用嵌套记录并声明一个本地类var‘r’,允许访问类型和实例

同时,我还提出了另一个解决方案,虽然它使用了一个带有外部实例的类而不是一个记录,但我不想这样做,但我没有看到其他方法,所以感谢您的解决方案

TMyRecord
MyField1: string = Hello, world!
MyField2: Integer = 123
MyField3: Extended = 3.1415927 

感谢陆路的贡献!非常聪明,使用嵌套记录并声明一个本地类var‘r’,允许访问类型和实例

同时,我还提出了另一个解决方案,虽然它使用了一个带有外部实例的类而不是一个记录,但我不想这样做,但我没有看到其他方法,所以感谢您的解决方案

TMyRecord
MyField1: string = Hello, world!
MyField2: Integer = 123
MyField3: Extended = 3.1415927 

既然可以直接获取字段值,为什么要使用RTTI?MyField1、MyField2、MyField3.1。因为我不仅对字段值感兴趣,还对字段名和字段类型感兴趣。2.因为这只是一个例子。在我的实际代码中,该记录包含974个字段。遍历这些字段需要5行代码。逐个访问它们需要974行代码。3.因为当新字段添加到记录中时,它们将自动包含在ToString的输出中。谢谢你解释动机。请看我的答案,它将解决您的问题。当您可以直接获取字段值时,为什么要使用RTTI?MyField1、MyField2、MyField3.1。因为我不仅对字段值感兴趣,还对字段名和字段类型感兴趣。2.因为这只是一个例子。在我的实际代码中,该记录包含974个字段。遍历这些字段需要5行代码。逐个访问它们需要974行代码。3.因为当新字段添加到记录中时,它们将自动包含在ToString的输出中。谢谢你解释动机。看看我的答案,它会解决你的问题。该死,我希望有一个不同的答案。但如果是这样的话。。。谢谢你的回答!根据你为什么要使用静态记录,你当然可以让一个普通的记录在其他单位看起来像一个静态记录。但如果是这样的话。。。谢谢你的回答!当然,根据您希望使用静态记录的原因,您可以使普通记录在其他单元中看起来像静态记录。
type
  TMyRecord = class
  private
    constructor create;
  public
    MyField1: string;                
    MyField2: integer;            
    MyField3: extended;             
    function ToString: string; 
  end;
var
  MyRecord: TMyRecord;

constructor TMyRecord.Create;
begin
  MyField1 := 'Hello, world!';
  MyField2 := 123;
  MyField3 := 3.1415927;
end;  

function TMyRecord.ToString: string;
var
  Field: TRttiField;
begin
  Result := sLineBreak;
  for Field in TRTTIContext.Create.GetType(Self.ClassType).GetFields do
    Result := Result + Format('%s: %s = %s', [Field.Name, Field.FieldType.ToString, Field.GetValue(Self).ToString]) + sLineBreak;
end;