Cara membandingkan jenis

130

Pertanyaan cepat: bagaimana cara membandingkan tipe Type (pun tidak dimaksudkan) dengan tipe lain di C #? Maksudku, aku punya Type typeFielddan saya ingin tahu apakah itu System.String, System.DateTime, dll, tapi typeField.Equals(System.String)tidak bekerja.

Ada petunjuk?

Archedius
sumber

Jawaban:

179

Coba yang berikut ini

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

The typeofoperator dalam C # akan memberikan Typeobjek untuk jenis yang bernama. Typeinstance dapat dibandingkan dengan ==operator sehingga ini adalah metode yang baik untuk membandingkannya.

Catatan: Jika saya ingat dengan benar, ada beberapa kasus di mana ini rusak ketika jenis yang terlibat adalah antarmuka COM yang tertanam ke dalam rakitan (melalui NoPIA). Tidak terdengar seperti ini di sini.

JaredPar
sumber
74

Anda dapat menggunakannya untuk is operator . Anda kemudian dapat memeriksa apakah objek adalah tipe spesifik dengan menulis:

if (myObject is string)
{
  DoSomething()
}
Rafal Spacjer
sumber
3
Apakah lebih baik bagi kita "apakah" atau "tipe"?
Brent Wagoner
32

Anda dapat membandingkan untuk tipe yang sama persis menggunakan:

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

typeof mengembalikan objek Type dari kelas yang diberikan.

Tetapi jika Anda memiliki tipe B, yang mewarisi dari A, maka perbandingan ini salah. Dan Anda mencari IsAssignableFrom .

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

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

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

Jika instance Anda adalah Type:

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

tetapi jika instance Anda adalah objectdan bukan Typepenggunaan, asoperator:

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

ini memiliki keuntungan untuk mengkonversi valuehanya sekali ke tipe yang ditentukan.

Syntony
sumber