User u = new User();
Type t = typeof(User);
u is User -> returns true
u is t -> compilation error
Jak sprawdzić, czy jakaś zmienna jest tego typu?
Odpowiedzi:
Pozostałe odpowiedzi zawierają istotne pominięcia.
is
Operator ma nie sprawdzić, czy rodzaj runtime argumentu jest dokładnie dany typ; raczej sprawdza, czy typ środowiska wykonawczego jest zgodny z danym typem:
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.
Ale sprawdzanie tożsamości typu z odbiciami sprawdza tożsamość , a nie zgodność
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
Jeśli nie tego chcesz, prawdopodobnie chcesz 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
na typeof(Animal)
. Tak więc staje się ulepszona forma Marka t.IsInstanceOfType(x)
.
GetType()
istnieje w każdym typie frameworka, ponieważ jest zdefiniowany w object
typie podstawowym . Tak więc, niezależnie od samego typu, możesz go użyć do zwrócenia bazowegoType
Więc wszystko, co musisz zrobić, to:
u.GetType() == t
Musisz sprawdzić, czy typ Twojej instancji jest równy typowi klasy. Aby uzyskać typ instancji, użyj GetType()
metody:
u.GetType().Equals(t);
lub
u.GetType.Equals(typeof(User));
powinien to zrobić. Oczywiście możesz użyć '==' do porównania, jeśli wolisz.
u.GetType.Equals(typeof(User));
t
która zawiera typ.
Aby sprawdzić, czy obiekt jest zgodny ze zmienną danego typu, zamiast pisać
u is t
powinieneś napisać
typeof(t).IsInstanceOfType(u)
typeof(Animal).IsInstanceOfType(x)
jest krótszy i prostszy niżtypeof(Animal).IsAssignableFrom(x.GetType());
(a Resharper zasugeruje użycie pierwszego, jeśli użyjesz drugiego).