1

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

2 回答 2

2

IsType<T>如果要检查TList(来自 的那个),则必须使用该方法System.Classes

如果你想检查它是否是一个TList<T>你必须对类名进行一些字符串解析。如果您想检查T. 这是因为 Delphi 没有关于泛型类型的特殊 RTTI,并且它不支持开放的泛型类型。

您可以查看Spring.HelpersSpring4D 中的单元如何解决此问题。

一些使用这个的示例代码:

if f.FieldType.IsGenericType then
  if f.FieldType.GetGenericTypeDefinition = 'TList<>' then
    if f.FieldType.GetGenericArguments[0].Handle = TypeInfo(TMyClass) then
      Writeln('found');
于 2014-07-02T10:06:14.360 回答
-1

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

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

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

于 2014-07-02T12:13:39.993 回答