【问题标题】:Delphi 2010 RTTI and Pointer fieldsDelphi 2010 RTTI 和指针字段
【发布时间】:2010-06-22 00:10:13
【问题描述】:

我在以下代码中有问题:

program Project4;

{$APPTYPE CONSOLE}

uses
  SysUtils, RTTI;

type

  TRecord2 = record
    c: integer;
    d: integer;
  end;

  TClass1 = class
  public
    FRecord: record
      a: integer;
      b: integer;
    end;
    FRecord2: TRecord2;
    FPointRecord3: ^TRecord2;

    constructor Create;
  end;

constructor TClass1.Create;
begin
  FPointRecord3 := nil;
end;

var
  lContext: TRttiContext;
  lType: TRttiType;
  lFields: TArray<TRttiField>;
  i: integer;
begin
  try
    { TODO -oUser -cConsole Main : Insert code here }
    lContext := TRttiContext.Create;

    lType := lContext.GetType(TClass1);

    lFields := lType.GetFields;
    for i := 0 to Length(lFields) - 1 do
    begin
      write('Name = '+lFields[i].Name+', ');
      if lFields[i].FieldType <> nil then
        writeln('Type = '+lFields[i].FieldType.ToString)
      else
        writeln('Type = NIL!!!');
    end;
    lContext.Free;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

输出:

Name = FRecord, Type = :TClass1.:1
Name = FRecord2, Type = TRecord2
Name = FPointRecord3, Type = NIL!!!

lFields[i].FieldType 返回 NIL 如何使用 RTTI 获取类型指针类型字段?

【问题讨论】:

    标签: delphi rtti


    【解决方案1】:

    它不会创建任何类型信息,因为您实际上从未为它定义过类型。您只需将字段定义为指向已定义类型的指针,因此编译器会即时为其创建一个临时“类型”,但不会创建 RTTI。

    如果你想让它工作,这样做:

    type
    
      TRecord2 = record
        c: integer;
        d: integer;
      end;
      PRecord2 = ^TRecord2;
    
      TClass1 = class
      public
        FRecord: record
          a: integer;
          b: integer;
        end;
        FRecord2: TRecord2;
        FPointRecord3: PRecord2;
    
        constructor Create;
      end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多