Apa cara paling sederhana untuk menguji jika suatu objek mengimplementasikan antarmuka yang diberikan dalam C #? (Jawab untuk pertanyaan ini di Jawa )
c#
reflection
interface
JoshRivers
sumber
sumber
if (object is IBlah iblah) { iblah.SomeMethod(); }
Menggunakan
is
atauas
operator adalah cara yang benar jika Anda mengetahui jenis antarmuka pada waktu kompilasi dan memiliki instance dari jenis yang Anda uji. Sesuatu yang tampaknya tidak disebutkan oleh orang lain adalahType.IsAssignableFrom
:Saya pikir ini jauh lebih rapi daripada melihat melalui array yang dikembalikan oleh
GetInterfaces
dan memiliki keuntungan bekerja untuk kelas juga.sumber
typeof(IList).IsAssignableFrom(someType)
, tanpa<>
.Sebagai contoh:
Untuk kelas:
Periksa apakah
typeof(MyClass).GetInterfaces()
mengandung antarmuka.sumber
Jika Anda ingin menggunakan objek typecasted setelah centang:
Sejak C # 7.0:
Ini sama dengan
Lihat .NET Docs: Pencocokan pola dengan
is
pola # Typesumber
Variasi jawaban @ AndrewKennan akhirnya saya gunakan untuk jenis yang diperoleh saat runtime:
sumber
Posting ini adalah jawaban yang bagus.
Ini adalah contoh sederhana:
atau
sumber
Selain pengujian menggunakan operator "is", Anda dapat menghias metode Anda untuk memastikan bahwa variabel yang dikirimkan ke sana mengimplementasikan antarmuka tertentu, seperti:
Saya tidak yakin versi Net mana ini diimplementasikan sehingga mungkin tidak bekerja dalam versi Anda.
sumber
Apa yang berhasil untuk saya adalah:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
sumber
Baru-baru ini saya mencoba menggunakan jawaban Andrew Kennan dan itu tidak berhasil untuk beberapa alasan. Saya menggunakan ini sebagai gantinya dan itu berhasil (catatan: menulis namespace mungkin diperlukan).
sumber
Saya menggunakan
Assert.IsTrue(myObject is ImyInterface);
untuk pengujian dalam unit test saya yang menguji bahwa myObject adalah objek yang telah mengimplementasikan antarmuka saya ImyInterface.
sumber
Saya memiliki situasi di mana saya mengirimkan variabel ke suatu metode dan tidak yakin apakah itu akan menjadi antarmuka atau objek.
Tujuannya adalah:
Saya mencapai ini dengan yang berikut:
sumber
Ini seharusnya bekerja:
Tapi bagus juga:
Atau bahkan (tidak terlalu elegan):
sumber