测试对象是否实现接口

时间:2009-01-04 01:25:10

标签: c# reflection interface

如果对象在C#中实现给定接口,测试的最简单方法是什么? (回答这个问题 in Java

12 个答案:

答案 0 :(得分:521)

if (object is IBlah)

IBlah myTest = originalObject as IBlah

if (myTest != null)

答案 1 :(得分:208)

如果您在编译时知道接口类型并且具有您正在测试的类型的实例,则使用isas运算符是正确的方法。其他人似乎没有提到的是Type.IsAssignableFrom

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

我认为这比查看GetInterfaces返回的数组要简洁得多,并且具有为类工作的优势。

答案 2 :(得分:19)

对于实例:

if (obj is IMyInterface) {}

对于班级:

检查typeof(MyClass).GetInterfaces()是否包含界面。

答案 3 :(得分:15)

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

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

答案 4 :(得分:7)

如果要在检查后使用类型转换的对象:
从C#7.0开始:

if (obj is IMyInterface myObj)

这与

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

请参阅.NET文档:Pattern matching with is # Type pattern

答案 5 :(得分:3)

除了使用“is”运算符进行测试之外,您还可以修饰方法以确保传递给它的变量实现特定的接口,如下所示:

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

我不确定.Net的哪个版本已经实现,因此它可能无法在您的版本中使用。

答案 6 :(得分:3)

这个Post是一个很好的答案。

public interface IMyInterface {}

public class MyType : IMyInterface {}

这是一个简单的示例:

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

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

答案 7 :(得分:2)

对我有用的是:

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

答案 8 :(得分:1)

最近我尝试使用Andrew Kennan的答案,但由于某些原因它并没有为我工作。我使用了它而且它有效(注意:可能需要编写命名空间)。

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

答案 9 :(得分:0)

我用过

Assert.IsTrue(myObject is ImyInterface);

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

答案 10 :(得分:0)

我遇到了一种情况,我正在将变量传递给方法,并且不确定它是接口还是对象。

目标是:

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

答案 11 :(得分:-13)

这应该有效:

MyInstace.GetType().GetInterfaces();

但也很好:

if (obj is IMyInterface)

甚至(不是很优雅):

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