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

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

12 ответов


if (object is IBlah)

или

IBlah myTest = originalObject as IBlah

if (myTest != null)

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

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

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


к примеру:

if (obj is IMyInterface) {}

класс:

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


вариант ответа @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)));


Если вы хотите использовать типизированный объект после проверки:
Начиная С C# 7.0:

if (obj is IMyInterface myObj)

Это то же самое, что

IMyInterface myObj = obj as IMyInterface;
if (myObj != null)

см. .NET Docs:поиск по шаблону с is # тип pattern


недавно я попытался использовать ответ Эндрю Кеннана, и по какой-то причине это не сработало для меня. Я использовал это вместо этого, и это сработало (Примечание: может потребоваться запись пространства имен).

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

Я

Assert.IsTrue(myObject is ImyInterface);

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


этой в должности - хороший ответ.

public interface IMyInterface {}

public class MyType : IMyInterface {}

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

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

или

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

У меня была ситуация, когда я передавал переменную методу и не был уверен, будет ли это интерфейс или объект.

цели:

  1. если элемент интерфейса, создать объект на основе этого интерфейса является параметром в вызове конструктора.
  2. если элемент является объектом, верните null, так как constuctor для моих вызовов ожидает интерфейс, и я не хотел, чтобы код бак.

Я достиг этого с следующее:

    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))