[Lazarus] Generics type as parameter

Sven Barth pascaldragon at googlemail.com
Sun May 13 10:53:42 CEST 2012


On 13.05.2012 02:49, Leonardo M. Ramé wrote:
> On 2012-05-12 13:07:18 -0300, Leonardo M. Ramé wrote:
>> Thanks Sven and Michalis. Using the suggestion by Michalis, I got a
>> solution mixing Generics and regular objects.
>>
>> What I'm pursuing is to replace my TCollection based ORM, with a
>> Generics based one, this allow users to write less code, in a clearer
>> way.
>>
>> The way the ORM works, is to create a TCollection instance, then execute
>> an ORM's method to load/save data into/from it, example:
>>
>> var
>>    lCustomers: TCustomers; // this is a TCollection descendant
>> begin
>>    lCustomers := TCustomers.Create;
>>    FConnector.LoadData(lCustomers, []);
>>    ... do something with lCustomers ...
>>    lCustomers.Free;
>> end;
>>
>> As you can see, FConnector.LoadData receives a TCollection as parameter,
>> and using RTTI, it fills each TCustomer published property.
>>
>> With Michalis's solution, I can turn my ORM from TCollections to
>> Generics with very little changes, see how small is the unit customer
>> now, instead of a complete TCollection/TCollectionItem definition:
>>
>
> Following the same subject, inside a method receiving an TFPSList, how
> can I know the type of items it will contain, even if the list is
> empty?.
>
> In a TCollection, I can use myCollection.ItemClass to know it, but in a
> specialized Generic type, how can I know, in an abstract way the type of
> a TFPGList<T>?. I mean, what type is T?.

You can't. That's why the method with the "parent class" might be 
considered less powerful than the one with generic methods/procedures.

Regards,
Sven





More information about the Lazarus mailing list