Da wir einen Typconstraint auf class haben, können wir davon ausgehen dass jedes T eine Klasse ist.
Somit können wir auch gefahrlos einen Hardcast auf TCustomObjectList<TObject> machen (Stichwort: Kovarianz).
Bei der Instanzierung einer Liste, merken wir uns, von welchem Typ T ist.
Dies muss auf Instanzebene gespeichert werden, damit wir auch nach dem zuvor erwähnten Hardcast noch die richtige Klasse herausbekommen.
Delphi-Quellcode:
type
TCustomObjectList<T: class> = class(TObjectList<T>)
private
FItemClass: TClass;
public
constructor Create(AOwnsObjects: Boolean = True); overload;
function AsNonGeneric: TCustomObjectList<TObject>;
property ItemClass: TClass read FItemClass;
end;
TCustomObjectList = TCustomObjectList<TObject>;
function TCustomObjectList<T>.AsNonGeneric: TCustomObjectList<TObject>;
begin
Result := TCustomObjectList<TObject>(Self);
end;
constructor TCustomObjectList<T>.Create(AOwnsObjects: Boolean);
begin
inherited Create(AOwnsObjects);
FItemClass := T;
end;
procedure Test(ObjectList: TCustomObjectList);
begin
Writeln(objectList.ItemClass.ClassName);
end;
var
ZahlungsartList: TCustomObjectList<TZahlungsart>;
Postleitzahlen: TCustomObjectList<TPostleitzahlen>;
begin
ZahlungsartList := TCustomObjectList<TZahlungsart>.Create;
Postleitzahlen := TCustomObjectList<TPostleitzahlen>.Create;
Test(ZahlungsartList.AsNonGeneric);
Test(Postleitzahlen.AsNonGeneric);
end.