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#如何确定一个类型是不是实现了给定的接口?的主要内容,如果未能解决你的问题,请参考以下文章
您如何确定给定的类型(System.Type)是不是继承自特定的基类(在 .Net 中)?