C#如何确定一个类型是不是实现了给定的接口?

Posted

技术标签:

【中文标题】C#如何确定一个类型是不是实现了给定的接口?【英文标题】:C# How to determine if a type implements a given interface?C#如何确定一个类型是否实现了给定的接口? 【发布时间】:2013-02-14 20:15:20 【问题描述】:

我希望以下内容返回true

var isIt = IsDisposable(typeof(TextWriter));

地点:

bool IsIDisposable(Type t)
    ??? 
    // I tried:
    //return t.IsSubclassOf(typeof(IDisposable)); //returns false
    // the other t.IsXXX methods don't fit the requirement as far as I can tell

【问题讨论】:

使用反射。这篇 SO 文章有帮助吗? ***.com/questions/1519530/… 检查“t as/is IDisposable”能解决问题吗? @Anthony 我没有类型的实例,而是类型。不能在上面使用is(我的意思是我可以,但它不会按预期工作) 当然。我删除了我的评论,因为它变得更加明显你实际上正在使用该类型。 @RvdK 与 Anthony 的评论相同。我不处理某种类型的实例,而是处理Type 【参考方案1】:

您可以使用IsAssignableFrom

bool IsDisposable = typeof(IDisposable).IsAssignableFrom(typeof(TextWriter));

DEMO

【讨论】:

不,你不能。 IsAssignableFrom 反之亦然:BaseType.IsAssignableFrom(Derived) 返回 true。 好吧,这行得通 :) 实际上,它可能比GetInterfaces().Upvoted 更快 我也在 ideone 上做了一个演示,以证明它不起作用:)(在阅读您更新的答案之前) @Christi:是的,我在一分钟后更新了我的答案,但在你发表评论之前。我发现 IsAssignableFrom 中的正确顺序很难记住。 IsAssignableFrom() 看似向后的语义让我在自己寻找解决方案时错过了它。 IMO,如果有一个 Type.IsAssignableTo(Type) 方法代替(或除了......)会更好【参考方案2】:

我找到了:Type.GetInterfaces() 正是我需要的:

bool IsIDisposable(Type t)
    return t.GetInterfaces().Contains(typeof(IDisposable));

从文档中,Type.GetInterfaces() 返回:

类型:System.Type[] 代表所有类型对象的数组 由当前类型实现或继承的接口。

【讨论】:

即使你实现了说IFoo,而后者又实现了IDisposable,这项工作是否有效?

以上是关于C#如何确定一个类型是不是实现了给定的接口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中编写实现给定接口的通用容器类?

您如何确定给定的类型(System.Type)是不是继承自特定的基类(在 .Net 中)?

了解类型参数是不是在 c# 2.0 中实现接口的更简单方法是啥?

如何动态确定类型是不是是使用反射的接口?

检查类型是不是实现了泛型接口而不考虑泛型类型参数

如何确定内部类是不是实现了接口?