Delphi 在运行时获取类中变量名的列表

Delphi 在运行时获取类中变量名的列表,delphi,Delphi,我在程序中声明了一些简单的类,例如 MyClass = class Var1 : Integer Var2 : Integer end; 我想做的是在运行时获取这个类(“MyClass”)中的变量列表(可能类似于组件的“GetPropList”) 我想到了类似的东西(显然,函数“GetVarNames”不存在,但我希望这会给出一个想法),它将“MyClass”中列出的变量的名称拉入TStringList中的字符串中: var MyVariableNamesList:

我在程序中声明了一些简单的类,例如

MyClass = class 
    Var1 : Integer
    Var2 : Integer
end;
我想做的是在运行时获取这个类(“MyClass”)中的变量列表(可能类似于组件的“GetPropList”)

我想到了类似的东西(显然,函数“GetVarNames”不存在,但我希望这会给出一个想法),它将“MyClass”中列出的变量的名称拉入TStringList中的字符串中:

var
    MyVariableNamesList: TStringList
    i : integer;

begin
    MyVariableNamesList := TStringList.create;        
    MyVariableNamesList := GetVarNames(MyClass)

end;

有人能提供建议吗?如果这是一个愚蠢的问题,请提前道歉

根据您的Delphi版本,您可以使用新的RTTI(与Delphi 2010一起引入)

你可以这样做:

function GetVarNames(const AClass : TObject) : TStringList;
var lType : TRttiType;
  lContext : TRttiContext;
  lProperty : TRttiProperty;
  lField : TRttiField;
begin
  Result := TStringList.create;
  LType := lContext.GetType(AClass.ClassType);
  if assigned(LType) then
  begin
    for LProperty in LType.GetProperties do
    begin
      Result.Add(lProperty.Name);
      //Get current value:
      Result.Add(lProperty.GetValue(AClass).ToString);
    end;
   for lField in LType.GetFields do
   begin
     Result.Add(lField.Name);
     //Get current value:
     Result.Add(lField.GetValue(AClass).ToString);
   end;
 end;
end;

首先,我建议发布这些字段,然后使用RTTI获取(并可能设置)值。如果变量已发布,您可以使用RTTI获取(并可能设置)值。Mybe这很有帮助:不需要创建TRttiContext,也不需要释放它。您忘记了“end;”并将AClassType定义为TObject,那么,对于LType.GetFields中的LField,就可以。。。然后,使用LField.GetValue(AInstance)还可以获得field@Linas:实际上,您确实需要
Create()
Free()
创建
TRttiContext
,即使它是记录而不是类。在内部,
TRttiContext.Create()
分配并填充RTTI池(如果RTTI池还没有),并且
TRttiContext.Free()
在需要时释放它。@RemyLebeau我不知道你从哪里得到这个消息,但是如果你查看源代码,你可以看到TRttiContext调用中的所有方法首先都会被重新调用(与Create中相同)。因此,基本上可以保证每个TRttiContext方法调用都已填充RTTI池。