2010-05-24 10 views
6

Voglio confrontare il tipo di un oggetto con un tipo per vedere se sono uguali. Non ho l'oggetto, solo il tipo di oggetto.Come funziona l'operatore "è" internamente

posso fare type1 == type2 e ricevere parità generale

posso avere un ciclo ricorsivo dove Ripeto il passo precedente per type1.BaseType finché la BaseType è nullo.

posso fare type1.GetInterface(type2.FullName) != null per verificare se tipo2 è un'interfaccia di tipo 1

Se metto tutto insieme, ottengo

if (type2.IsInterface) 
    return type1.GetInterface(type2.FullName) != null; 

while (type1 != null) { 
    if (type1 == type2) 
    return true; 

    type1 = type1.BaseType; 
} 
return false; 

è che tutta la parola chiave è is. Non riesco a trovare la parola giusta da inserire nella ricerca Reflector per trovare la funzione e una ricerca su google "è" non è stato davvero utile

+9

Dipende da cosa il significato della parola "è" è –

+0

+1 interessante. Tuttavia, suppongo che la parola chiave "is" sia implementata in modo nativo nel runtime e non utilizzi la reflection. – tster

+3

Non avrei mai pensato di vedere una citazione di Bill Clinton su SO. –

risposta

6

is (§14.9.10 di the standard) utilizza generalmente isinst, ma non è così necessario se il tipo in fase di compilazione è compatibile tramite determinate conversioni.

Un equivalente (al contrario) con un oggetto Tipo è IsAssignableFrom. Tutti questi sono veri:

"foo" is String; 
"foo" is object; 

typeof(String).IsAssignableFrom("foo".GetType()); 
typeof(object).IsAssignableFrom("foo".GetType()); 
+1

Attenzione, un'istruzione 'isinst' non viene sempre generata. Il compilatore C# può dire quando sei stupido e genererà confronti con null invece di 'isinsts'. –

Problemi correlati