首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查看类型是否实现了接口?

如何查看类型是否实现了接口?
EN

Stack Overflow用户
提问于 2010-10-25 14:51:31
回答 5查看 7.2K关注 0票数 6

我需要知道Type是否实现了一个接口。

代码语言:javascript
复制
 Dim asmRule As System.Reflection.Assembly = System.Reflection.Assembly.LoadFrom(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Rule.dll"))

 For Each typeAsm As System.Type In asmRule.GetTypes
     If TypeOf typeAsm Is Rule.IRule Then
       'that does always return false even though they implement IRule'
     End If
 Next

多亏了所有人。现在我知道为什么类型不起作用了。该类型自然不实现IRule。我从你的回答中筛选出两个选项:

  1. GetType(Rule.IRule).IsAssignableFrom(typeAsm)
  2. typeAsm.GetInterface(GetType(Rule.IRule).FullName) IsNot Nothing

什么是更好的选择,根据表现?

UPDATE:我发现最好使用:

代码语言:javascript
复制
Not typeAsm.GetInterface(GetType(Rule.IRule).FullName) Is Nothing

而不是

代码语言:javascript
复制
GetType(Rule.IRule).IsAssignableFrom(typeAsm)

因为接口IRule本身是可分配的IRule,所以如果我尝试创建一个实例,就会引发MissingMethodExcpetion:

代码语言:javascript
复制
ruleObj = CType(Activator.CreateInstance(typeAsm, True), Rule.IRule)

UPDATE2:多亏了Ben,。他让我相信,IsAssignableFrom与IsAbstract相结合可能是检查给定类型是否实现接口的最佳方法,而并不是接口本身的(如果尝试创建实例,则会抛出MissingMethodException )。

代码语言:javascript
复制
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-25 14:56:21

TypeOf ... Is可以很好地处理继承:

代码语言:javascript
复制
Imports System

Public Class Test

    Public Shared Sub Main()
        Dim o As Object = 5

        If TypeOf o Is IFormattable Then
            Console.WriteLine("Yes")
        End If
    End Sub    

End Class

它的工作方式与C#中的"is“相同。

但是,在您的示例中,这是试图查看System.Type (或其他实际使用的子类)是否实现了Rule.IRule。那不管用..。因为您对System.Type是否实现接口不感兴趣,所以您感兴趣的是typeAsm变量所引用的System.Type实例是否实现了IRule.Rule

换句话说,您的代码在C#中也不会运行得更好。在讨论Type.IsAssignableFrom实例时需要使用System.Type

代码语言:javascript
复制
If GetType(Rule.IRule).IsAssignableFrom(typeAsm) Then
票数 13
EN

Stack Overflow用户

发布于 2010-10-25 14:55:49

在C#中:

代码语言:javascript
复制
x is Class1 

在VB.NET中:

代码语言:javascript
复制
TypeOf x Is Class1

在这里描述。

票数 5
EN

Stack Overflow用户

发布于 2010-10-25 14:55:47

另一种选择:

代码语言:javascript
复制
If myType.GetInterface("Rule.IRule") IsNot Nothing Then

http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4015761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档