Проверьте, реализует ли объект интерфейс - PullRequest
318 голосов
/ 04 января 2009

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

Ответы [ 12 ]

522 голосов
/ 04 января 2009
if (object is IBlah)

или

IBlah myTest = originalObject as IBlah

if (myTest != null)
209 голосов
/ 07 января 2009

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

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

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

19 голосов
/ 04 января 2009

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

if (obj is IMyInterface) {}

Для класса:

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

15 голосов
/ 14 ноября 2012

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

if (serviceType.IsInstanceOfType(service))
{
    // 'service' does implement the 'serviceType' type
}
7 голосов
/ 27 июня 2018

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

if (obj is IMyInterface myObj)

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

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

См. Документы .NET: Соответствие шаблону с is # Тип шаблона

3 голосов
/ 23 июля 2017

Это Пост - хороший ответ.

public interface IMyInterface {}

public class MyType : IMyInterface {}

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

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

или

typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
3 голосов
/ 07 января 2009

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

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

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

2 голосов
/ 16 сентября 2016

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

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

1 голос
/ 06 ноября 2014

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

if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
0 голосов
/ 24 июля 2018

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

Цели были:

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

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

    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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...