On 30.10.2015 20:10, leledumbo wrote:
Consider the following:

type
   generic TGenClass<T> = class
   ...
   end;

   TSpecType = specialize TGenClass<Integer>;

   TMyClass = class
     FST: TSpecType;
     procedure p;
   published
     ST: TSpecType read FST write FST;
   end;

procedure TMyClass.p;
...
begin
   PropCount := GetPropList(Self,Props);
   for i := 0 to PropCount - 1 do begin
     Prop := Props^[i];
     PropName := Prop^.Name;
     case Prop^.PropType^.Kind of
       tkObject: begin
         Obj := GetObjectProp(Self,Prop); //1
         ...
       end;
     end;
   end;
end;

In //1, GetObjectProp will return TObject for ST property. Since generic
types without specialization cannot be used in type declaration, how can I
get the actual type of ST and cast Obj to it so I can access its properties?
Note that ST here is just an example, there could be multiple TGenClass
specialization that TMyClass uses.

TGenClass<> is not a full type, only TGenClass<Integer> is, so you need to use - in your example - TSpecType(Obj). In Delphi mode you could also use TGenClass<Integer>(Obj). For mode ObjFPC you'll need to wait till I've finished generic functions, cause then "specialize TGenClass<Integer>(Obj)" will work as well. Note: specializations can also be declared locally in a procedure/function/method in a type section.

Regards,
Sven
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to