User u = new User();
Type t = typeof(User);
u is User -> returns true
u is t -> compilation error
Bagaimana cara menguji jika beberapa variabel memiliki beberapa tipe dengan cara ini?
Jawaban:
Jawaban lainnya semuanya mengandung kelalaian yang signifikan.
The is
Operator tidak tidak memeriksa apakah jenis runtime dari operan adalah persis jenis yang diberikan; sebaliknya, ia memeriksa apakah tipe runtime kompatibel dengan tipe yang diberikan:
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.
Tetapi memeriksa identitas tipe dengan refleksi memeriksa identitas , bukan untuk kompatibilitas
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
Jika bukan itu yang Anda inginkan, Anda mungkin menginginkan 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
untuk typeof(Animal)
. Jadi bentuk Mark yang ditingkatkan menjadi t.IsInstanceOfType(x)
.
GetType()
ada di setiap jenis kerangka kerja, karena ditentukan pada object
jenis dasar . Jadi, apa pun tipenya, Anda dapat menggunakannya untuk mengembalikan yang mendasarinyaType
Jadi, yang perlu Anda lakukan hanyalah:
u.GetType() == t
Anda perlu melihat apakah Jenis instans Anda sama dengan Jenis kelas. Untuk mendapatkan jenis instance, Anda menggunakan GetType()
metode:
u.GetType().Equals(t);
atau
u.GetType.Equals(typeof(User));
harus melakukannya. Jelas Anda bisa menggunakan '==' untuk melakukan perbandingan jika Anda mau.
u.GetType.Equals(typeof(User));
t
yang berisi tipe.
Untuk memeriksa apakah suatu objek kompatibel dengan variabel tipe tertentu, daripada menulis
u is t
kamu harus menulis
typeof(t).IsInstanceOfType(u)
typeof(Animal).IsInstanceOfType(x)
lebih pendek dan lebih mudah daripadatypeof(Animal).IsAssignableFrom(x.GetType());
(dan Resharper akan menyarankan menggunakan yang pertama jika Anda menggunakan yang terakhir).