Jak porównać typy


130

Szybkie pytanie: jak porównać typ typu (gra słów nie przeznaczonych) z innym typem w C #? To znaczy, Mam Type typeFieldi chcę wiedzieć, czy to jest System.String, System.DateTimeitd, ale typeField.Equals(System.String)nie działa.

Jakaś wskazówka?

Odpowiedzi:


182

Spróbuj wykonać następujące czynności

typeField == typeof(string)
typeField == typeof(DateTime)

typeofOperator w C # daje Typeobiektu dla wskazanego typu. Typeinstancje są porównywalne z ==operatorem, więc jest to dobra metoda ich porównywania.

Uwaga: Jeśli dobrze pamiętam, są pewne przypadki, w których to się psuje, gdy zaangażowane typy są interfejsami COM, które są osadzone w zestawach (przez NoPIA). Nie wygląda na to, że tak jest w tym przypadku.


79

Możesz użyć do tego is operatora . Możesz następnie sprawdzić, czy obiekt jest określonego typu, pisząc:

if (myObject is string)
{
  DoSomething()
}

4
Czy dla nas lepsze jest „jest” czy „typ”?
Brent Wagoner

32

Możesz porównać dokładnie ten sam typ za pomocą:

class A {
}
var a = new A();
var typeOfa = a.GetType();
if (typeOfa == typeof(A)) {
}

typeof zwraca obiekt Type z danej klasy.

Ale jeśli masz typ B, który dziedziczy po A, to porównanie jest fałszywe. I szukasz IsAssignableFrom .

class B : A {
}
var b = new B();
var typeOfb = b.GetType();

if (typeOfb == typeof(A)) { // false
}

if (typeof(A).IsAssignableFrom(typeOfb)) { // true
}

7

Jeśli Twoja instancja to Type:

Type typeFiled;
if (typeField == typeof(string))
{ 
    ... 
}

ale jeśli twoja instancja jest operatorem, objecta nie Typeużyj as:

object value;
string text = value as string;
if (text != null)
{
    // value is a string and you can do your work here
}

ma to tę zaletę, że konwertuje valuetylko raz na określony typ.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.