Apa cara paling sederhana untuk menguji jika suatu objek mengimplementasikan antarmuka yang diberikan dalam C #? (Jawab untuk pertanyaan ini di Jawa )
Apa cara paling sederhana untuk menguji jika suatu objek mengimplementasikan antarmuka yang diberikan dalam C #? (Jawab untuk pertanyaan ini di Jawa )
Jawaban:
if (object is IBlah)
atau
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
Menggunakan is
atau as
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 adalah Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
Saya pikir ini jauh lebih rapi daripada melihat melalui array yang dikembalikan oleh GetInterfaces
dan memiliki keuntungan bekerja untuk kelas juga.
typeof(IList).IsAssignableFrom(someType)
, tanpa <>
.
Sebagai contoh:
if (obj is IMyInterface) {}
Untuk kelas:
Periksa apakah typeof(MyClass).GetInterfaces()
mengandung antarmuka.
Jika Anda ingin menggunakan objek typecasted setelah centang:
Sejak C # 7.0:
if (obj is IMyInterface myObj)
Ini sama dengan
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
Lihat .NET Docs: Pencocokan pola dengan is
pola # Type
Variasi jawaban @ AndrewKennan akhirnya saya gunakan untuk jenis yang diperoleh saat runtime:
if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
}
Selain pengujian menggunakan operator "is", Anda dapat menghias metode Anda untuk memastikan bahwa variabel yang dikirimkan ke sana mengimplementasikan antarmuka tertentu, seperti:
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
Saya tidak yakin versi Net mana ini diimplementasikan sehingga mungkin tidak bekerja dalam versi Anda.
Apa yang berhasil untuk saya adalah:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
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).
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
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:
if(!typeof(T).IsClass)
{
// If your constructor needs arguments...
object[] args = new object[] { my_constructor_param };
return (T)Activator.CreateInstance(typeof(T), args, null);
}
else
return default(T);
Ini seharusnya bekerja:
MyInstace.GetType().GetInterfaces();
Tapi bagus juga:
if (obj is IMyInterface)
Atau bahkan (tidak terlalu elegan):
if (obj.GetType() == typeof(IMyInterface))