代码之家  ›  专栏  ›  技术社区  ›  Tim Schmelter

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

  •  6
  • Tim Schmelter  · 技术社区  · 15 年前

    我需要知道 Type 实现接口。

     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

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

    更新 :我发现最好使用:

    Not typeAsm.GetInterface(GetType(Rule.IRule).FullName) Is Nothing
    

    GetType(Rule.IRule).IsAssignableFrom(typeAsm)
    

    因为接口IRule本身是可分配的,如果我试图创建一个实例,会引发missingMethodException:

    ruleObj = CType(Activator.CreateInstance(typeAsm, True), Rule.IRule)
    

    更新2: 不是 接口本身(如果尝试创建实例,则抛出MissingMethodException)。

    If GetType(Rule.IRule).IsAssignableFrom(typeAsm) AndAlso Not typeAsm.IsAbstract Then
    
    5 回复  |  直到 13 年前
        1
  •  13
  •   Bobby    15 年前

    TypeOf ... Is 在继承方面表现良好:

    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
    

    然而,在您的示例中,这是为了看看 System.Type (或实际使用的任何子类)实现 Rule.IRule . 那个 不会 工作。。。因为你对 实现接口时,您感兴趣的是 实例 属于 系统类型 那个 typeAsm IRule.Rule .

    换句话说,你的代码在C语言中也不会有更好的效果。你需要 Type.IsAssignableFrom 当谈到 :

    If GetType(Rule.IRule).IsAssignableFrom(typeAsm) Then
    
        2
  •  5
  •   Steve Whitfield    15 年前

    x is Class1 
    

    在VB.NET中:

    TypeOf x Is Class1
    

    Described here.

        3
  •  3
  •   AdamH    15 年前

    If myType.GetInterface("Rule.IRule") IsNot Nothing Then
    

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

        4
  •  3
  •   SLaks    15 年前

    你用错了关键字。

    首席执行官# is TypeOf ... Is ... ,将检查实例是否属于实现接口的类型。
    因此,您的代码将检查 typeAsm System.Type 实例,实现 IRule 接口。
    系统类型 伊鲁尔 ,它将永远返回 False

    你实际上是在检查 类型由 系统类型 工具 伊鲁尔 .
    为此,您需要使用 系统类型 上课。

     If typeAsm.GetInterface(GetType(Rule.IRule)) IsNot Nothing Then
    
        5
  •  2
  •   Ben Voigt    15 年前