2012-05-02 15 views

risposta

153

Le altre risposte contengono tutte omissioni significative.

L'operatore fa isnon controllo se il tipo di runtime operando è esattamente tipo indicato; piuttosto, controlla per vedere se il tipo di runtime è compatibile con il tipo di dato:

class Animal {} 
class Tiger : Animal {} 
... 
object x = new Tiger(); 
bool b1 = x is Tiger; // true 
bool b2 = x is Animal; // true also! Every tiger is an animal. 

Ma il controllo di tipo identità con gli assegni di riflessione per identità, non per compatibilità

bool b3 = x.GetType() == typeof(Tiger); // true 
bool b4 = x.GetType() == typeof(Animal); // false! even though x is an animal 

Se questo non è quello che vuoi, allora probabilmente desideri IsAssignableFrom:

bool b5 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true 
bool b6 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger. 
+1

Mentre l'approccio finale mostrato qui funziona, è inutilmente prolisso. 'typeof (Animale) .IsInstanceOfType (x)' è più corto e più diretto di 'typeof (Animale). IsAssignableFrom (x.GetType());' (e Resharper suggerirà di usare il primo se si usa quest'ultimo). –

11

GetType() esiste su ogni singolo tipo di framework, poiché è definito sul tipo base object. Quindi, indipendentemente dal tipo di per sé, è possibile utilizzarlo per restituire il valore sottostante Type

Quindi, tutto quello che dovete fare è:

u.GetType() == t 
+9

risposta di Eric sotto è di gran lunga migliore - si prega di leggere. –

+1

In realtà la risposta di Eric è utile e tutto, ma non risponde alla domanda reale di come testare con un tipo sconosciuto nel modo "u is t" descritto nella domanda originale, e il tuo lo fa. – Daniel

7

Hai bisogno di vedere se il tipo di istanza è uguale a il Tipo della classe. Per ottenere il tipo di esempio si utilizza il metodo GetType():

u.GetType().Equals(t); 

o

u.GetType.Equals(typeof(User)); 

dovrebbe farlo. Ovviamente potresti usare '==' per fare il tuo confronto se preferisci.

+0

+1 Ma preferisco la seconda scelta. 'u.GetType.Equals (typeof (User));' –

+0

Un motivo per cui questo è meno sicuro dell'uso == - è che se GetType() restituisce in qualche modo null, verrà generato. –

+1

@Fuex, sì, a, penso che rende il codice più facile da leggere se typeof è in linea, motivo per cui l'ho postato in quel modo, anche se nell'esempio OP ha già una variabile 't' che contiene il tipo . –

4

al fine di verificare se un oggetto è compatibile con una data variabile tipo, invece di scrivere

u is t 

si dovrebbe scrivere

typeof(t).IsInstanceOfType(u) 
+1

Qual è il vantaggio della sintassi più verbosa rispetto alla sintassi 'u is t'? –

+0

@KyleHumfeld Se avevate Type pippo; Oggetto A; non puoi scrivere "A is foo", ma puoi scrivere foo.isInstanceOfType (A) –

Problemi correlati