2014-07-02 22 views
1

使用Delphi如何检查对象的字段是否为TList?使用Delphi检查字段是否为TList

我tryed使用此

var 
    c : TRttiContext; 
    t : TRttiType; 
    f : TRttiField; 
begin 
    c := TRttiContext.Create; 
    t := c.GetType(Self.ClassType); 
    for f in t.GetFields do begin 
     //check if the field is TList<T> 
     //check also the Generic type T 
    end; 
end; 

回答

2

你,如果你想检查TList(一个从System.Classes)使用IsType<T>方法。

如果你想检查它是否为TList<T>你必须做一些类名解析。如果你想检查T的具体类型,更是如此。这是因为Delphi没有关于泛型类型的特殊RTTI,并且它不支持开放泛型类型。

你可以看看Spring4D的Spring.Helpers单元如何解决这个问题。

使用这方面的一些示例代码:

if f.FieldType.IsGenericType then 
    if f.FieldType.GetGenericTypeDefinition = 'TList<>' then 
    if f.FieldType.GetGenericArguments[0].Handle = TypeInfo(TMyClass) then 
     Writeln('found'); 
-1

可以检查对象包含ToArray()方法:

var 
    method: TRttiMethod; 
begin 
    ... 
    method := f.FieldType.GetMethod('ToArray'); 
    if Assigned(method) then 
    begin 
    //... 
    end; 

但是请注意,这将返回True所有TList<>后代了。

+1

-1,所有具有“ToArray”方法的类都会被找到...... – whosrdaddy

+0

这就是我在上一段中所说的;) –

+1

不只是列出后代,而是任何带有“ToArray”的类。例如。一个TQueue,或者一个可能的TMyListWhichIsNotATList ... –