<p>Am 18.08.2016 15:09 schrieb "Felipe Monteiro de Carvalho" <<a href="mailto:felipemonteiro.carvalho@gmail.com">felipemonteiro.carvalho@gmail.com</a>>:<br>
><br>
> On Thu, Aug 18, 2016 at 2:44 PM, Sven Barth <<a href="mailto:pascaldragon@googlemail.com">pascaldragon@googlemail.com</a>> wrote:<br>
> > generic procedure WriteVector_To_DM<T>(ADest: TDataManager; ASelf:<br>
> > specialize TVector<T>);<br>
> > generic procedure ReadVector_From_DM<T>(AFrom: TDataManager; var ASelf:<br>
> > specialize TVector<T>);<br>
> ><br>
> > and use them like this:<br>
> ><br>
> > specialize WriteVector_To_DM<TSubClass1>(...);<br>
><br>
> Aha, great, didn't know we had something in this direction. But<br>
> correct me if I am wrong, but this wouldn't work in my case, because<br>
> my function writes the class to a stream in the end of it, so it needs<br>
> to know which type T is. If the type is TSomeClass or a descendent,<br>
> then it will write each field of the class to the stream.<br>
><br>
> But in a generic class/function there is no way to ask if T is an int,<br>
> or is an TSomeClass, or am I missing some way of writing code that is<br>
> different for various possible types?</p>
<p>You can enforce that T needs to be a subclass of TSomeClass by declaring it as "T: TSomeClass"; like this:</p>
<p>generic procedure WriteVector_To_DM<T: TSomeClass>(ADest: TDataManager; ASelf: specialize TVector<T>);</p>
<p>In that case the compiler knows that T will at least be a TSomeClass so you can use methods and fields of it without problems.</p>
<p>Note: these generic constraints also work for generic types and is already in 3.0.0 for them.</p>
<p>Additionally you can play around with TypeInfo() which works on variables of a generic type as well.</p>
<p>Regards,<br>
Sven</p>