Hätt schwören können, da stand gestern was anderes, egal.
Hab nicht dran gedacht, dass beim Add in die TInterfaceList auch nen QueryInterface gemacht wird, also wird T dann wieder auf IInterface "gecastet". Das musst du dann beim Get wieder umdrehen:
Delphi-Quellcode:
function TGenericInterfaceList<T>.Get(Index: Integer): T;
begin
FInterfaces[Index].QueryInterface(GetTypeData(TypeInfo(T)).Guid, Result);
end;
Bis XE2 Update 2 ging folgendes:
Delphi-Quellcode:
type
TFoo<T> = class
FValue: T;
function GetAsObject: TObject;
end;
function TFoo<T>.GetAsObject: TObject;
begin
Result := TObject(FValue);
end;
"Mach doch nen constraint drauf" mag jemand sagen. Stimmt, solang ich nur Objekte reinpacken will. Eventuell will ich aber Interfaces und Objekte damit verwalten und dann macht sowas eventuell Sinn.
Jedenfalls muss man ab Update 3 dann sowas schreiben:
Delphi-Quellcode:
function TFoo<T>.GetAsObject: TObject;
begin
Result := TObject(PPointer(@FValue)^);
end;
Wenn du generische Listen mit entsprechenden Interfaces haben möchtest, schau dir eventuell
Delphi Coll oder Spring an.