关于c#:测试对象是否实现了接口

Test if object implements interface

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


1
if (object is IBlah)

1
2
3
IBlah myTest = originalObject as IBlah

if (myTest != null)


使用isas算子是正确的路,如果你知道在编译的时间和类型的接口有一个实例,你的类型的检测。在其他的东西似乎是一个有Type.IsAssignableFrom提到:

1
2
3
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}

我认为这是一neater比多,通过对阵列GetInterfaces归侨和有优势的是营运类井。


的示例:

1
if (obj is IMyInterface) {}

为类:

如果typeof(MyClass).GetInterfaces()检查包含的接口。


在回答andrewkennan变化在线"的第一端上使用的是目前在运行时类型:

1
2
3
4
if (serviceType.IsInstanceOfType(service))
{
    // 'service' does implement the 'serviceType' type
}

如果你想使用typecasted对象后的检查:由于C:# 7.0

1
if (obj is IMyInterface myObj)

这是相同的

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

NET的文档:国有企业与is#型模式,模式匹配


这是一个很好的答案的帖子。

1
2
3
public interface IMyInterface {}

public class MyType : IMyInterface {}

这是一个简单的示例:

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

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


此外,测试使用的"是"),你可以装饰你的方法对确保通过实施特定的变量,它的操作系统的界面,如:

1
2
3
4
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)));


最近我想利用安德鲁凯南的回答和它是不是为我工作的一些原因。我用这个和它的工作。(注:可能需要在写作中的)。

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


我有一个可变情况传递到方法和是不是知道这是要去是一个接口或一个对象。

的目标分别为:

  • 如果一个项目是一个基于对象的接口,instantiate接口接口是与作为参数的构造函数的调用。
  • 如果该项目是一个对象,返回null。由于我是一constuctor expecting接口和I didn’t want the码的坦克。
  • 实现这一具有以下:

    1
    2
    3
    4
    5
    6
    7
    8
        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);

    我用的

    Assert.IsTrue(myObject is ImyInterface);

    如果在我的单元测试的测试对象,这是一个试验,如果我有imyinterface接口实现的。


    这应该工作。

    1
    MyInstace.GetType().GetInterfaces();

    不太好。

    1
    if (obj is IMyInterface)

    (或甚至不甚优雅):

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