检查字段是否是带有反射的TList



使用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

相关内容

  • 没有找到相关文章

最新更新