Vielleicht kannst du etwas Logik von Compilezeit in Richtung Laufzeit verschieben. Z.B. könntest du TFoo im Konstruktor eine TypeInfo übergeben und dann irgendwie so:
Delphi-Quellcode:
function Iterate(ATypeInfo: PTypeInfo): Cardinal;
var
i: Integer;
TypeData: PTypeData;
begin
TypeData := GetTypeData(ATypeInfo);
for i := TypeData^.MinValue to TypeData^.MaxValue do
Writeln(GetEnumName(ATypeInfo, i));
end;
begin
Iterate(TypeInfo(TTypeKind));
end.
arbeiten. Mit der mangelnde Typsicherheit (Enum -> Integer) müsstest du bei einer Lösung mit Generics vermutlich auch leben.