使用Delphi如何检查对象的字段是否为TList ?
我试过使用这个
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;
如果您想检查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');
您可以检查对象是否包含ToArray()
方法:
var
method: TRttiMethod;
begin
...
method := f.FieldType.GetMethod('ToArray');
if Assigned(method) then
begin
//...
end;
请注意,这也将为所有TList<>
后代返回True
。