测试对象是否实现接口

在c#中测试对象是否实现给定接口的最简单方法是什么?(回答这个问题 在Java中) < / p >
265612 次浏览
if (object is IBlah)

IBlah myTest = originalObject as IBlah


if (myTest != null)

例如:

if (obj is IMyInterface) {}

本课程:

检查typeof(MyClass).GetInterfaces()是否包含该接口。

这应该可以工作:

MyInstace.GetType().GetInterfaces();

但也很好:

if (obj is IMyInterface)

甚至(不是很优雅):

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

除了使用"is"操作符进行测试外,你还可以装饰你的方法,以确保传递给它的变量实现了特定的接口,如下所示:

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

我不确定这是在哪个版本的。net中实现的,所以它可能在你的版本中不起作用。

使用isas操作符是正确的方法,如果你在编译时知道接口类型,并且有一个你正在测试的类型的实例。其他人似乎没有提到的Type.IsAssignableFrom:

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

我认为这比查看GetInterfaces返回的数组整洁得多,并且具有适用于类的优点。

@AndrewKennan的答案的一个变体,我最近在运行时获得的类型中使用了:

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

我使用

Assert.IsTrue(myObject is ImyInterface);

在我的单元测试中测试myObject是一个实现了我的接口ImyInterface的对象。

最近我试着用安德鲁·凯南的答案,但出于某种原因,它对我不起作用。我使用了这个方法,并且它有效(注意:可能需要写入名称空间)。

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

对我有用的是:

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

帖子是一个很好的答案。

public interface IMyInterface {}


public class MyType : IMyInterface {}

这是一个简单的例子:

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

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

如果你想在检查后使用类型转换对象:
从c# 7.0开始:

if (obj is IMyInterface myObj)

这和

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

参见。net Docs: 模式匹配概述

我有这样一种情况,我把一个变量传递给一个方法,不确定它是一个接口还是一个对象。

目标是:

  1. 如果item是一个接口,则基于该接口实例化一个对象,该接口是构造函数调用中的参数。
  2. 如果项目是一个对象,返回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);

我通过使用is关键字实现了这一点。

但是我还需要一个新的对象来使用接口属性。 要实现这一点,你需要在Interface.

后添加新变量
objectToCheck is Interface newVariableWithInterfaceProperties

 public async Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken,
RequestHandlerDelegate<TResponse> next)
{
if (request is ICacheableQuery cachableRequest)
{
// here cachableRequest now has the interface properties.
}
}
    interface IItem
{


}


class ItemImp : IItem
{


}


class Program
{
static void Main(string[] args)
{
Type t = typeof(ItemImp);


Console.WriteLine("t == typeof(IItem) -> {0}", t == typeof(IItem));
Console.WriteLine("typeof(IItem).IsAssignableFrom(t) -> {0}", typeof(IItem).IsAssignableFrom(t));
Console.WriteLine("t is IItem -> {0}", t is IItem);
Console.WriteLine("new ItemImp() is IItem -> {0}", new ItemImp() is IItem);
}
}


// Here are outputs:
// t == typeof(IItem) -> False
// typeof(IItem).IsAssignableFrom(t) -> True
// t is IItem -> False
// new ItemImp() is IItem -> True