Saya tahu is
dan as
untuk instanceof
, tapi bagaimana dengan metode isInstance () reflektif ?
Saya tahu is
dan as
untuk instanceof
, tapi bagaimana dengan metode isInstance () reflektif ?
Jawaban:
Setara dengan Java obj.getClass().isInstance(otherObj)
di C # adalah sebagai berikut:
bool result = obj.GetType().IsAssignableFrom(otherObj.GetType());
Perhatikan bahwa meskipun Java dan C # bekerja pada objek tipe runtime (Java java.lang.Class
≣ C # System.Type
) dari sebuah obj
(via .getClass()
vs .getType()
), Java isInstance
menggunakan objek sebagai argumennya, sedangkan C # IsAssignableFrom
mengharapkan System.Type
objek lain .
is
Sebaliknya, diperlukan nama tipe. Inilah yang diinginkan OP: setara dengan Java isInstance
. Jawaban lainnya salah meskipun jumlah upvote yang konyol.
bool result = (obj is MyClass); // Better than using 'as'
new Child() is Parent
)
Tergantung, gunakan is
jika Anda tidak ingin menggunakan hasil gips dan gunakan as
jika Anda melakukannya. Anda hampir tidak pernah ingin menulis:
if(foo is Bar) {
return (Bar)foo;
}
Dari pada:
var bar = foo as Bar;
if(bar != null) {
return bar;
}
di luar kepala saya, Anda juga bisa melakukan:
bool result = ((obj as MyClass) != null)
Tidak yakin mana yang berkinerja lebih baik. Saya akan menyerahkannya kepada orang lain untuk melakukan benchmark :)
Kode di bawah ini bisa menjadi alternatif IsAssignableFrom
.
parentObject.GetType().IsInstanceOfType(inheritedObject)
Lihat Deskripsi Type.IsInstanceOfType di MSDN.