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池。