Bir nesne C # 'da belirli bir arabirimi uygularsa test etmenin en basit yolu nedir? (Bu soruya Java ile cevap verin )
Bir nesne C # 'da belirli bir arabirimi uygularsa test etmenin en basit yolu nedir? (Bu soruya Java ile cevap verin )
Yanıtlar:
if (object is IBlah)
veya
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
Derleme zamanında arabirim türünü biliyorsanız ve sınadığınız türün bir örneğine sahipseniz is
veya as
işleçlerini kullanmak doğru yoldur. Kimsenin bahsetmediği bir şey Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
Ben bu döndü dizi bakarak daha temiz GetInterfaces
ve sınıflar için de çalışma avantajı olduğunu düşünüyorum .
typeof(IList).IsAssignableFrom(someType)
olmadan <>
.
Örneğin:
if (obj is IMyInterface) {}
Sınıf için:
typeof(MyClass).GetInterfaces()
Arayüzü içerip içermediğini kontrol edin .
Kontrolden sonra yazılan nesneyi kullanmak istiyorsanız:
C # 7.0'dan beri:
if (obj is IMyInterface myObj)
Bu aynı
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
Bkz. .NET Belgeleri: # Tür deseniyle desen eşlemeis
@ AndrewKennan'ın cevabındaki bir varyasyon, çalışma zamanında elde edilen türler için son zamanlarda kullandım:
if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
}
"İs" operatörünü kullanarak test etmeye ek olarak, kendisine iletilen değişkenlerin aşağıdaki gibi belirli bir arayüz uyguladığından emin olmak için yöntemlerinizi dekore edebilirsiniz:
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
Bu sürümün hangi sürümü uygulandığından emin değilim, bu yüzden sürümünüzde çalışmayabilir.
Benim için işe yarayan:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
Son zamanlarda Andrew Kennan'ın cevabını kullanmayı denedim ve bir nedenden dolayı benim için işe yaramadı. Bunun yerine kullandım ve işe yaradı (not: ad alanını yazmak gerekli olabilir).
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
Bir yönteme değişken geçirdiğim bir durum vardı ve bir arabirim mi yoksa nesne mi olacağından emin değildim.
Hedefler:
Bunu aşağıdakilerle başardım:
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);
Bu çalışmalı :
MyInstace.GetType().GetInterfaces();
Ama güzel de:
if (obj is IMyInterface)
Ya da (çok zarif değil):
if (obj.GetType() == typeof(IMyInterface))