Який найпростіший спосіб тестування, якщо об’єкт реалізує заданий інтерфейс у C #? (Відповідь на це питання на Java )
Який найпростіший спосіб тестування, якщо об’єкт реалізує заданий інтерфейс у C #? (Відповідь на це питання на Java )
Відповіді:
if (object is IBlah)
або
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
Використання is
або 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
}
Це повідомлення - хороша відповідь.
public interface IMyInterface {}
public class MyType : IMyInterface {}
Це простий зразок:
typeof(IMyInterface).IsAssignableFrom(typeof(MyType))
або
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
Окрім тестування за допомогою оператора "є", ви можете прикрасити свої методи, щоб переконатися, що змінні, передані йому, реалізують певний інтерфейс, наприклад:
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))