2010-12-17 101 views
5

有没有办法在事先不知道它们是什么的情况下迭代D2010中的对象的成员变量?迭代成员变量

+0

您使用的是哪个版本的delphi? – RRUZ 2010-12-17 00:25:32

+0

我正在使用德尔福2010年。 – 2010-12-17 00:30:00

回答

2

是的,如果您使用的是Delphi 2010或更高版本。您可以使用扩展RTTI来获取有关对象的字段,方法和属性的信息。简单的版本:

procedure GetInfo(obj: TObject); 
var 
    context: TRttiContext; 
    rType: TRttiType; 
    field: TRttiField; 
    method: TRttiMethod; 
    prop: TRttiProperty; 
begin 
    context := TRttiContext.Create; 
    rType := context.GetType(obj.ClassType); 
    for field in rType.GetFields do 
    ;//do something here 
    for method in rType.GetMethods do 
    ;//do something here 
    for prop in rType.GetProperties do 
    ;//do something here 
end; 

必要的对象可以在RTTI单位被发现。

在Delphi的早期版本中,有一些更有限的RTTI可以获得关于某些属性和方法的一些信息,但它不能做太多。

+0

方法/领域/属性必须是“发布”或他们可以正常? – 2010-12-17 00:44:32

+0

@John:默认情况下,为所有字段和'public'或'published'属性和方法生成扩展RTTI。这可以在您使用'{$ RTTI}'编译器指令编写的代码中进行更改,但除非使用它们的修改版本,否则对于标准库而言它已经非常适合了。 (这是可能的,但Embarcadero正式劝阻。) – 2010-12-17 00:56:57

+0

嗯,Borland对RTL重建非常友好,他们最近是否改变了策略? – 2010-12-17 01:34:17