Проверить, реализует ли объект интерфейс

Каков самый простой способ тестирования, если объект реализует данный интерфейс в С#? (Ответьте на этот вопрос в Java)

Ответ 1

if (object is IBlah)

или

IBlah myTest = originalObject as IBlah

if (myTest != null)

Ответ 2

Использование операторов is или as является правильным способом, если вы знаете тип интерфейса во время компиляции и имеете экземпляр типа, который вы тестируете. Что-то, о чем никто больше не упоминал, Type.IsAssignableFrom:

if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}

Я думаю, что это намного опрятно, чем просмотр массива, возвращаемого GetInterfaces, и имеет то преимущество, что он работает и для классов.

Ответ 3

Для экземпляра:

if (obj is IMyInterface) {}

Для класса:

Проверьте, содержит ли typeof(MyClass).GetInterfaces() интерфейс.

Ответ 4

Отклонение от ответа @AndrewKennan. Я в конечном итоге использовал для типов, полученных во время выполнения:

if (serviceType.IsInstanceOfType(service))
{
    // 'service' does implement the 'serviceType' type
}

Ответ 5

В дополнение к тестированию с использованием оператора "is" вы можете украсить свои методы, чтобы убедиться, что переменные, переданные ему, реализуют определенный интерфейс, например:

public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
     //Some bubbly sorting
}

Я не уверен, какая версия .Net была реализована, поэтому она может не работать в вашей версии.

Ответ 6

Что для меня работало:

Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));

Ответ 7

Недавно я попытался использовать ответ Andrew Kennan, и по какой-то причине он не работал у меня. Я использовал это вместо этого, и он работал (обратите внимание: может потребоваться запись пространства имен).

if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)

Ответ 8

Я использовал

Assert.IsTrue(myObject is ImyInterface);

для теста в моем unit test, который проверяет, что myObject является объектом, который реализовал мой интерфейс ImyInterface.

Ответ 9

Этот Сообщение является хорошим ответом.

public interface IMyInterface {}

public class MyType : IMyInterface {}

Это простой пример:

typeof(IMyInterface).IsAssignableFrom(typeof(MyType))

или

typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))

Ответ 10

Это должно работать:

MyInstace.GetType().GetInterfaces();

Но хорошо тоже:

if (obj is IMyInterface)

Или даже (не очень элегантный):

if (obj.GetType() == typeof(IMyInterface))