2

我在使用 RTTi 时遇到了一些问题。我想枚举 Record 类型中的所有常量值

 type TMyRecord = record
  const
    value1: Integer=10;
    value2: Integer=13;
    value3: Integer=18;
    value4: Integer=22;
 end;
procedure TForm3.Button1Click(Sender: TObject);
var
 ctx:TRttiContext ;
 Field:rtti.TRttiField       ;
begin
 for Field in ctx.GetType(TypeInfo(TMyRecord)).GetFields     do
 ListBox1.Items.Add(Field.Name  );  // i got nothing
end;

但是当我的 Record 不是 const 时,我的代码可以正常工作

 type TMyRecord = record
   value1: Integer;
   value2: Integer;
   value3: Integer;
   value4: Integer;
  end;
procedure TForm3.Button1Click(Sender: TObject);
var
 ctx:TRttiContext ;
 Field:rtti.TRttiField       ;
begin
 for Field in ctx.GetType(TypeInfo(TMyRecord)).GetFields     do
 ListBox1.Items.Add(Field.Name  );  //its work
end;
4

1 回答 1

4

RTTI 不能枚举常量。虽然它们可能看起来是字段,但它们不是。它们像任何其他常量一样在记录的命名空间内实现。

您可能不得不考虑另一种方法。例如,您可以使用属性而不是常量。或者可能添加一个枚举这些常量的类函数。

另一种方法是这样的:

type
  TMyRecord = record
    value1: Integer;
    value2: Integer;
    value3: Integer;
    value4: Integer;  
 end;

const
  MyConst: TMyRecord = (
    value1: 10;
    value2: 13;
    value3: 18;
    value4: 22
  );
于 2012-10-27T08:12:14.297 回答