Obţinerea metainformaţiei despre tipul generic Nullable<T>
Dacă
C este o clasă generică:
Code: Select all
generic< typename T >
ref class C
{
// ...
};
atunci cu ajutorul cuîntului-cheie
typeid poate fi extrasă informaţia despre acest tip. De exemplu, următorul fragment obţine lista tuturor membrilor:
Code: Select all
Type ^ t = C::typeid;
array< MemberInfo ^ > ^ m = t->GetMembers();
Tehnica funcţionează şi în cazul claselor de sistem, de exemplu:
Code: Select all
t = Collections::Generic::List::typeid;
m = t->GetMembers();
Să încercăm o altă clasa generică de sistem --
Nullable:
Code: Select all
t = Nullable::typeid;
m = t->GetMembers();
Însă dacă analizăm lista membrilor, nu vom găsi membrii caracteristici ai tipului generic
Nullable --
HasValue şi
Value. O cercetare mai atentă ne explică cauza: există o altă clasă, non-generică, avînd acelaşi nume
Nullable. Anume aceasta este returnată de
typeid. Cum obţinem informaţie despre varianta generică? Încercarea următoare eşuează nefiind corectă sintactic:
(De fapt compilatorul se împiedică aici: „fatal error C1001: An internal error has occurred in the compiler”).
Prin urmare dacă un spaţiu de nume conţine doua clase avînd acelaşi nume, una fiind generică, atunci nu poate fi obţinută metainformaţia despre clasa generică.
Sursa:
http://social.msdn.microsoft.com/Forums ... 7a6d6ca3f/.