Какой самый простой способ проверки, если объект реализует данный интерфейс в C #? (Ответ на этот вопрос на Java )
c#
reflection
interface
JoshRivers
источник
источник
if (object is IBlah iblah) { iblah.SomeMethod(); }
Использование операторов
is
oras
является правильным способом, если вы знаете тип интерфейса во время компиляции и имеете экземпляр типа, который вы тестируете. То, что никто, кажется, еще не упомянул, этоType.IsAssignableFrom
:Я думаю, что это гораздо лучше, чем просматривать массив, возвращенный
GetInterfaces
и имеет преимущество работы с классами.источник
typeof(IList).IsAssignableFrom(someType)
без<>
.Для примера:
Для класса:
Проверьте,
typeof(MyClass).GetInterfaces()
содержит ли интерфейс.источник
Если вы хотите использовать типизированный объект после проверки:
начиная с C # 7.0:
Это так же, как
См. Документы .NET: сопоставление с
is
шаблоном # Тип шаблонаисточник
Вариант ответа @ AndrewKennan, который я недавно использовал для типов, полученных во время выполнения:
источник
Этот пост является хорошим ответом.
Это простой пример:
или
источник
В дополнение к тестированию с использованием оператора «is» вы можете декорировать ваши методы, чтобы убедиться, что передаваемые ему переменные реализуют определенный интерфейс, например так:
Я не уверен, в какой версии .Net это было реализовано, поэтому он может не работать в вашей версии.
источник
Что сработало для меня:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
источник
Недавно я попытался использовать ответ Эндрю Кеннана, и он почему-то не сработал. Я использовал это вместо этого, и это сработало (примечание: может потребоваться запись пространства имен).
источник
я использовал
Assert.IsTrue(myObject is ImyInterface);
для теста в моем модульном тесте, который проверяет, что myObject является объектом, который реализовал мой интерфейс ImyInterface.
источник
У меня была ситуация, когда я передавал переменную методу и не был уверен, будет ли это интерфейс или объект.
Цели были:
Я достиг этого с помощью следующего:
источник
Это должно работать:
Но тоже приятно:
Или даже (не очень элегантно):
источник