Joc02
Joc02

Reputation: 345

Delphi function generic

I would like to create a generic function. I'm novice in generic. I've 3 private lists of different type. I want a public generic method for return 1 item of the list.

I've the code below. (I have it simplifie)

TFilter = class
private
   FListFilter            : TObjectList<TFilterEntity>;
   FListFilterDate        : TObjectList<TFilterDate>;
   FListFilterRensParam   : TObjectList<TFilterRensParam>;
public
   function yGetFilter<T>(iIndice : integer) : T; 
....
function TFilter .yGetFilter<T>(iIndice : integer) : T; 
begin
    if T = TFilterEntity then
       result := T(FListFilter.Items[iIndice])
    else
       ....
end;

I know that code doesn't run, but can you tell me if it's possible to do a thing that it ?

Upvotes: 5

Views: 10728

Answers (1)

LU RD
LU RD

Reputation: 34889

Just introduce a constraint of the generic parameter T. It has to be a class.

From the documentation:

A type parameter may be constrained by zero or one class type. As with interface type constraints, this declaration means that the compiler will require any concrete type passed as an argument to the constrained type param to be assignment compatible with the constraint class. Compatibility of class types follows the normal rules of OOP type compatibilty - descendent types can be passed where their ancestor types are required.

Change declaration to:

function yGetFilter<T:class>(iIndice : integer) : T;

Update

It appears that in XE5 and earlier you get a compiler error:

E2015 Operator not applicable to this operand type

at this line:

if T = TFilterEntity then

In XE6 and above this bug is fixed.

To circumvent, do as David says in a comment:

if TClass(T) = TFilterEntity then

Upvotes: 2

Related Questions