2011-09-18 26 views
5

używam „jest” operator znaleźć pewną klasę:„jest” - operator dla typu

for(int i=0; i<screens.Count; i++){ 
    if(screen is ScreenBase){ 
    //do something... 
    } 
} 

Działa to dobrze, zwłaszcza, że ​​znajdzie każdą klasę, która dziedziczy z ScreenBase ale nie zajęcia bazą ScreenBase.

chciałbym zrobić to samo, gdy wiem tylko typ i nie chcą instancję klasy:

Type screenType = GetType(line); 
if (screenType is ScreenBase) 

Ale to comparsion generuje ostrzeżenie, jak to porównać do klasy „Type” .

Jedyną alternatywą, którą znam, byłoby porównanie z == typof, ale testowałoby to tylko dla typu dokładnego, a nie dziedziczonego. Czy istnieje sposób na uzyskanie podobnego zachowania, jak operator "jest", ale na typ opisany przez klasę Typ?

Odpowiedz

5

Jeśli chcesz wiedzieć dokładnie, czy pochodzi od typu, użyj Type.IsSubclassOf(). Ten nie będzie pracował dla interfejsów w postaci.

Type screenType = GetType(line); 
if (screenType.IsSubclassOf(typeof(ScreenBase))) 
{ 
    // do stuff... 
} 

W przeciwnym razie, jeśli chcesz wiedzieć, czy typ może być przypisana do zmiennej określonego typu, należy Type.IsAssignableFrom(). To będzie pracować dla interfejsów.

Type screenType = GetType(line); 
if (typeof(ScreenBase).IsAssignableFrom(screenType)) // note the usage is reversed 
{ 
    // do stuff... 
} 

Należy pamiętać, że nie koniecznie obiekt tekstowy do określenia tego, można to zrobić za pomocą instancji obiektu przy użyciu Type.IsInstanceOfType(). Będzie zachowywać się mniej więcej tak jak IsAssignableFrom().

if (typeof(ScreenBase).IsInstanceOfType(line)) // note the usage is reversed 
{ 
    // do stuff... 
} 
11

Jedyną alternatywą, którą znam, byłoby porównanie z == typeof, ale testowałoby to tylko dla typu dokładnego, a nie dziedziczonego. Czy istnieje sposób na uzyskanie podobnego zachowania, jak operator "jest", ale na typ opisany przez klasę Typ?

Jeśli GetType(line) zwraca typ (polecam lepszą nazwę dla tego, btw), można użyć Type.IsAssignableFrom:

if (typeof(ScreenBase).IsAssignableFrom(GetType(line))) 
{ 
} 
Powiązane problemy