如果对象在C#中实现给定接口,测试的最简单方法是什么? (回答这个问题 in Java)
答案 0 :(得分:521)
if (object is IBlah)
或
IBlah myTest = originalObject as IBlah
if (myTest != null)
答案 1 :(得分:208)
如果您在编译时知道接口类型并且具有您正在测试的类型的实例,则使用is
或as
运算符是正确的方法。其他人似乎没有提到的是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)
我遇到了一种情况,我正在将变量传递给方法,并且不确定它是接口还是对象。
目标是:
我通过以下方式实现了这一目标:
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))