In riflessione il tipo generico non costruito, diciamo C<>
si fusero con il tipo esempioC<T>
.
Questo è forse meno teoricamente puro; Penso a questi come entità molto diverse. Penso a uno come il simbolo "C con un parametro di tipo" e l'altro come tipo di compilazioneC<T>
. Nel codice, C<>
e C<T>
non sono sinonimi l'uno dell'altro; puoi creare un campo di quest'ultimo tipo se T è in ambito, ma non puoi mai creare un campo del primo tipo.
Che la libreria di riflessione fornisca il tipo del tipo di istanza quando si chiede il tipo non ricostruito non è poi così male. Cosa vorresti fare con il tipo non ricostruito? Non c'è niente che tu possa veramente fare con questo. Ma con il tipo di istanza, puoi dire "sostituto int per T" qui.
Il vero vantaggio di ottenere C<T>
quando si chiede per typeof(C<>)
è che questo ti dà sempre il tipo non ricostruito. Confronta:
class C<T>
{
public static Type CT() { return typeof(C<T>); }
public static Type JustC() { return typeof(C<>); }
}
Quando si chiama CT, che cosa hai intenzione di chiamare su? Non c'è nessun tipo C<T>
per chiamare CT. È possibile chiamare C<int>.CT
in tal caso si torna C<int>
, non C<T>
. L'unico modo per ottenere il tipo C<>
costruito con T è chiedere typeof(C<>)
.
Ha senso?
Non ho ancora coperto di riflessione (ho una vaga idea di cosa si tratta)
riflessione è semplicemente la libreria di codice che consente di ottenere informazioni sul codice nel codice stesso . "typeof" ti dà un oggetto Type che puoi quindi "riflettere" per trovare informazioni sul tipo.
io non sono sicuro di capire cosa si intende per "anche quando T non è di portata"
Il modo in cui ho detto che era confusa. L'ho riformulato.
fonte
2010-07-10 19:53:55
domanda molto buona +1 – nawfal