Какой самый простой способ проверки, если объект реализует данный интерфейс в C #? (Ответ на этот вопрос на Java )
Какой самый простой способ проверки, если объект реализует данный интерфейс в C #? (Ответ на этот вопрос на Java )
Ответы:
if (object is IBlah)
или
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
Использование операторов is
or as
является правильным способом, если вы знаете тип интерфейса во время компиляции и имеете экземпляр типа, который вы тестируете. То, что никто, кажется, еще не упомянул, это Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
Я думаю, что это гораздо лучше, чем просматривать массив, возвращенный GetInterfaces
и имеет преимущество работы с классами.
typeof(IList).IsAssignableFrom(someType)
без <>
.
Для примера:
if (obj is IMyInterface) {}
Для класса:
Проверьте, typeof(MyClass).GetInterfaces()
содержит ли интерфейс.
Если вы хотите использовать типизированный объект после проверки:
начиная с C # 7.0:
if (obj is IMyInterface myObj)
Это так же, как
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
См. Документы .NET: сопоставление с is
шаблоном # Тип шаблона
Вариант ответа @ AndrewKennan, который я недавно использовал для типов, полученных во время выполнения:
if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
}
В дополнение к тестированию с использованием оператора «is» вы можете декорировать ваши методы, чтобы убедиться, что передаваемые ему переменные реализуют определенный интерфейс, например так:
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
Я не уверен, в какой версии .Net это было реализовано, поэтому он может не работать в вашей версии.
Что сработало для меня:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
Недавно я попытался использовать ответ Эндрю Кеннана, и он почему-то не сработал. Я использовал это вместо этого, и это сработало (примечание: может потребоваться запись пространства имен).
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
У меня была ситуация, когда я передавал переменную методу и не был уверен, будет ли это интерфейс или объект.
Цели были:
Я достиг этого с помощью следующего:
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);
Это должно работать:
MyInstace.GetType().GetInterfaces();
Но тоже приятно:
if (obj is IMyInterface)
Или даже (не очень элегантно):
if (obj.GetType() == typeof(IMyInterface))