如何为TList <T>编写通用的FreeAll

Fra*_*ank 1 delphi generics

编写一个FreeAll函数的最佳方法是什么,该函数将获取TList<T>列表的每个元素的泛型和免费?

这是不合理的,TList<T>.FreeAll因为如果泛型类型是Record或String则没有意义.然而,如果泛型类型是一个对象,如果有某种方法可以实现FreeAll功能,那将非常方便.

我的简单尝试不能编译......

TTest1 = Class

End;

Procedure FreeAll(List : TList<TObject>);
Var
    I : Integer;
Begin
    For I := 0 To List.Count - 1 Do
        List[I].Free;
End;


Procedure Main;
Var
    List : TList<TTest1>;
    I : Integer;
Begin
    List := TList<TTest1>.Create;
    List.Add(TTest1.Create);
    List.Add(TTest1.Create);
    List.Free;

    FreeAll(List);

    List.Free;
End;
Run Code Online (Sandbox Code Playgroud)

jac*_*ate 9

在相同的Generics.collections.pas单元中,您有TObjectList,OwnsObjects属性可能就是您要查找的内容(例如,将OwnsObject设置为true,调用Clear方法并正确释放所有列出的对象).

或者您可以编写自己的TList(或者可能是TObjectList)后代,您可以将其添加为方法.