Risposte:
Le altre risposte contengono tutte omissioni significative.
L' is
operatore non controlla se il tipo di runtime dell'operando è esattamente il tipo dato; piuttosto, verifica se il tipo di runtime è compatibile con il tipo specificato:
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 dell'identità del tipo con la riflessione controlla l' identità , non la compatibilità
bool b5 = x.GetType() == typeof(Tiger); // true
bool b6 = x.GetType() == typeof(Animal); // false! even though x is an animal
or with the type variable
bool b7 = t == typeof(Tiger); // true
bool b8 = t == typeof(Animal); // false! even though x is an
Se non è quello che vuoi, probabilmente vuoi IsAssignableFrom:
bool b9 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
bool b10 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.
or with the type variable
bool b11 = t.IsAssignableFrom(x.GetType()); // true
bool b12 = t.IsAssignableFrom(x.GetType()); // true! A
t
per typeof(Animal)
. Quindi la forma migliorata di Mark diventa t.IsInstanceOfType(x)
.
GetType()
esiste su ogni singolo tipo di framework, perché è definito sul object
tipo di base . Quindi, indipendentemente dal tipo stesso, puoi usarlo per restituire il sottostanteType
Quindi, tutto ciò che devi fare è:
u.GetType() == t
Devi vedere se il tipo della tua istanza è uguale al tipo della classe. Per ottenere il tipo di istanza si utilizza il GetType()
metodo:
u.GetType().Equals(t);
o
u.GetType.Equals(typeof(User));
dovrebbe farlo. Ovviamente potresti usare '==' per fare il confronto se preferisci.
u.GetType.Equals(typeof(User));
t
che contiene il tipo.
Per verificare se un oggetto è compatibile con una data variabile di tipo, invece di scrivere
u is t
dovresti scrivere
typeof(t).IsInstanceOfType(u)
typeof(Animal).IsInstanceOfType(x)
è più breve e più semplice ditypeof(Animal).IsAssignableFrom(x.GetType());
(e Resharper suggerirà di utilizzare il primo se utilizzi il secondo).