在c#中测试对象是否实现给定接口的最简单方法是什么?(回答这个问题 在Java中)
当前回答
@AndrewKennan的答案的一个变体,我最近在运行时获得的类型中使用了:
if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
}
其他回答
如果您在编译时就知道接口类型,并且拥有正在测试的类型的实例,那么使用is或作为操作符是正确的方法。其他人似乎没有提到的是类型。IsAssignableFrom:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
我认为这比查看GetInterfaces返回的数组要简洁得多,而且也具有适用于类的优点。
除了使用"is"操作符进行测试外,你还可以装饰你的方法,以确保传递给它的变量实现了特定的接口,如下所示:
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
我不确定这是在哪个版本的。net中实现的,所以它可能在你的版本中不起作用。
如果你想在检查后使用类型转换对象: 从c# 7.0开始:
if (obj is IMyInterface myObj)
这和
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
参见.NET文档:模式匹配概述
对我有用的是:
断言。IsNotNull (typeof (YourClass) .GetInterfaces()。(i => i == typeof (ISomeInterface)));
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